size_t sizeof
演算子 型によって扱える数値の範囲が異なるのは,値を記憶するために消費するメモリ領域の大きさが型によって違うためです。メモリの1単位は1byte です。8-bit で1byte,1bit には0か1かが入るので,1byte のメモリ領域を使う変数の場合,28=256個の数字が扱えます。signed char
型変数が -127 から 127 の255個の整数を扱えるのは,変数一つに付き1byte のメモリ領域を消費するからです。
消費するメモリ領域の大きさをサイズ(size)と言います。変数のサイズを求める演算子が sizeof
演算子です。
■sizeof
演算子
sizeof(変数), sizeof 変数
sizeof
演算子は非負整数(バイト数)を返します。(したがって,オブジェクト型に制限されます。[C99, 6.5.3.4])その戻り値の型は size_t
で,int
や long
などの整数型とは区別しています。size_t
はメモリのバイト数を表す型です。(その定義はヘッダ stddef.h
内にあります。[C99, 6.5.3.4, 4]) 但し,ある変数を size_t
型として宣言するには以下のいずれかの標準ライブラリを読み込む必要があります。
stddef.h
,stdio.h
,stdlib.h
,string.h
,time.h
,wchar.h
/* Example 4.8 */ #include <stdio.h> int main(void) { printf("Type\t\tByte(s)\tBit(s)\n"); printf("char\t\t%zd\t%zd\n", sizeof(char), 8*sizeof(char)); printf("short\t\t%zd\t%zd\n", sizeof(short), 8*sizeof(short)); printf("int\t\t%zd\t%zd\n", sizeof(int), 8*sizeof(int)); printf("long\t\t%zd\t%zd\n", sizeof(long), 8*sizeof(long)); printf("long long\t%zd\t%zd\n", sizeof(long long), 8*sizeof(long long)); printf("float\t\t%zd\t%zd\n", sizeof(float), 8*sizeof(float)); printf("double\t\t%zd\t%zd\n", sizeof(double), 8*sizeof(double)); printf("long double\t%zd\t%zd\n", sizeof(long double), 8*sizeof(long double)); return 0; }
* 仕様(C99)では,size_t
型の出力には z
を付すとなっている。[C99, 7.19.6.1]
[例]%zd
,%zo
実行結果(奥山研究室の場合)
Type Byte(s) Bit(s) char 1 8 short 2 16 int 4 32 long 4 32 long long 8 64 float 4 32 double 8 64 long double 8 64
char
型のサイズが1byte,short
が 16-bit,int
と long
が同じで 32-bit になっています。また,float
が 32-bit,double
はその倍の 64-bit です。但し,プログラムの移植性を考えた場合,int
が16-bit,long
が32-bit と考えた方が良いでしょう。
扱える桁数も上のサイズに応じて決まります。整数の桁数を確認してみましょう。
/* Example 4.9 */ #include <stdio.h> #include <limits.h> int main(void) { printf("TYPE\t\tMIN\t\t\tMAX\n"); printf("char\t\t%d\t\t\t%d\n", CHAR_MIN, CHAR_MAX); printf("short\t\t%d\t\t\t%d\n", SHRT_MIN, SHRT_MAX); printf("int\t\t%d\t\t%d\n", INT_MIN, INT_MAX); printf("long\t\t%ld\t\t%ld\n", LONG_MIN, LONG_MAX); printf("long long\t%lld\t%lld\n", LLONG_MIN, LLONG_MAX); return 0; }
出力結果(奥山研究室の場合)
TYPE MIN MAX char -128 127 short -32768 32767 int -2147483648 2147483647 long -2147483648 2147483647 long long -9223372036854775808 9223372036854775807
CHAR_MIN
や CHAR_MAX
などは,ヘッダ limits.h
で定義されている値です。また,%lld
の ll
は long long
用の変換指定子です。「3.1. 型指定子」で見た最小値(MIN)と異なります。扱える最大値,最小値は処理系依存な訳です。