データ型モデル・規格Cごとの接尾語なし10進定数の型の違い

個人的メモです。

データ型モデル

char short int long long long void *
ILP32 8 16 32 32 64 64
LP64 8 16 32 64 64 64

規格Cごとの接尾語なしの10進定数の型について。
以下のうち、その定数がオーバーフローしないような最小の型が選ばれる*1

C89 int, long, unsigned long
C99 int, long, long long

データ型モデル・規格Cごとの接尾語なし10進定数(「-」は動作未定義)

2の冪乗 10進定数 ILP32/C89 ILP32/C99 LP64/C89 LP64/C99
0〜2^31-1 0〜2,147,483,647 int int int int
2^31〜2^32-1 〜4,294,967,295 unsigned long*2 long long long long
2^32〜2^63-1 〜9,223,372,036,854,775,807 - long long long long
2^63〜2^64-1 〜18,446,744,073,709,551,615 - - unsigned long*3 -

*1:参考「Cリファレンスマニュアル 第5版」p28

*2:gccにおいてC90モードでコンパイル時、「this decimal constant is unsigned only in ISO C90」という警告が出力されます。「C90」(ISO C90)とは、C89(ANSI C89)の別称。

*3:2を参照。