法大奥山研究室

 previous  contents

4.5. 変数のサイズ: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 で,intlong などの整数型とは区別しています。size_t はメモリのバイト数を表す型です。(その定義はヘッダ stddef.h 内にあります。[C99, 6.5.3.4, 4]) 但し,ある変数を size_t 型として宣言するには以下のいずれかの標準ライブラリを読み込む必要があります。

stddef.hstdio.hstdlib.hstring.htime.hwchar.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,intlong が同じで 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_MINCHAR_MAX などは,ヘッダ limits.h で定義されている値です。また,%lldlllong long 用の変換指定子です。「3.1. 型指定子」で見た最小値(MIN)と異なります。扱える最大値,最小値は処理系依存な訳です。


 previous  contents