はじめての C

[Learning GNU C]

3.2. data の 型

C によって 定義される 全ての data の 型は byte と 呼ばれる memory の 単位から なる。 多くの コンピュータ構造では 1 byte は 8 bits から なり それぞれの bit は 0 または 1 を 保持する。 2つの 状態 (0 または 1) を もつ これらの 8 bits から 256 の 組み合わせ (28) が 生じる。 そして 2 bytes を 占める 整数 integer では 0 から 65535 の間の 数を 保持することが できる (0 から 216、しかし 通常 整数の 変数は その最初の bit で 数値が 正か 負の どちらかを 保持するため 使われるので これらの 値は -32768 から +32767 の間に なる)。

(次に) 述べるように C language には 8つの 基本となる data の 型が 定義されている。 異なる サイズの 整数を 保持する 5つの 型と 浮動小数点 floating point (小数点を 伴う) 値を 保持する 3つの 型だ。 C では text のための 基本となる data の 型は 用意されていない。 text は 個々の 文字から なり 文字は 数値によって 表す。 前の 例題では 整数の 型の 1つ "int" が 使われた。 これは C languahe では もっとも 普通に 用いられる 型だ。

コンピュータ プログラムで 使う 大部分の data は 整数型から なるので 浮動小数点を 論じるのは 少し 後とする。サイズの 順序は 整数型で 最小の ものから 始めて "char"、"short"、"int"、"long" そして "long long" だ。 (一般的に) より 小さな 型では わずかの memory しか 占めないという 利点が あり 大きな 型では 性能上の 不利益を まねく。 int 型の 変数は 可能な かぎり 大きな 整数を 保持しても 性能上の 不利益を こうむらない。 その理由は int の 変数が 使用する コンピュータの 種類により (その大きさを) 違えることが できるからだ。

char 型の data は 通常 1 byte で それは 普通 文字 character 1つ分を 保持するのに 使われるため そう 呼ばれる。 多くの desktop 機は "32-bit" で これ (bit数) は 処理のため 設計された data の サイズを 参照している。 int 型の data は 32-bit の machine 上では 4 bytes (232) を 占める。 short は 通常 小さく long は 大きく できるか または int と 同じ サイズであり 最後に long long は 非常に 大きな 数を 扱う。

一般的に 使われる 変数の 型では application の 速度や memory 使用上に 大きな 影響が ない。 特別の 必要が なければ ほとんどで int 変数を 使うことが できる。 この本では それが 重要に なる いくつかの 事例を 示すよう 努める。 10年前は 多くの machine が 16-bit の CPU を もち その int 変数の サイズは 2 bytes が 限度だった。 当時 short 変数は 同じく 2 bytes で long は 4 bytes だったはずだ。 現在 32-bit の machine では int 型の 既定値 default は 通常 long 型の 変数の 要求に 使えるほど 十分 大きい。 long long 型は ごく 最近 非常に 大きな 数を 扱うため 導入された。

ある コンピュータでは 非常に 大きい 数を 扱うのに より 適しているため そうした machine では data 型の サイズは ずっと 大きなものに なる。 machine の それぞれの data 型の サイズを 調べるため (次の) code を コンパイルし 実行する。 これには 新しく sizeof() という 言語要素 language construct が 1つ 使われる。 それは data 型を 占める byte 数が いくらかを 報告する。

Example 3-2. sizeof_types.c

int
main()
{
printf("sizeof(char) == %d\n", sizeof(char));
printf("sizeof(short) == %d\n", sizeof(short));
printf("sizeof(int) == %d\n", sizeof(int));
printf("sizeof(long) == %d\n", sizeof(long));
printf("sizeof(long long) == %d\n", size of (long long));

return 0;
}