整数定数
整数型の値を式の中で直接使用できるようにします。
目次 |
[編集] 構文
整数定数は以下の形式の非左辺値式です。
decimal-constant integer-suffix(オプション) | (1) | ||||||||
octal-constant integer-suffix(オプション) | (2) | ||||||||
hex-constant integer-suffix(オプション) | (3) | ||||||||
ただし
- decimal-constant はゼロ以外の10進数字 (
1
,2
,3
,4
,5
,6
,7
,8
,9
) に0個以上の10進数字 (0
,1
,2
,3
,4
,5
,6
,7
,8
,9
) が続いたものです。 - octal-constant は数字のゼロ (
0
) に0個以上の8進数字 (0
,1
,2
,3
,4
,5
,6
,7
) が続いたものです。 - hex-constant は文字シーケンス
0x
または文字シーケンス0X
に1個以上の16進数字 (0
,1
,2
,3
,4
,5
,6
,7
,8
,9
,a
,A
,b
,B
,c
,C
,d
,D
,e
,E
,f
,F
) が続いたものです。 - integer-suffix (もしあれば) は、以下のいずれかまたは両方を含んでも構いません (両方の場合、いずれの順序でも構いません)。
- unsigned-suffix (文字
u
または文字U
) - long-suffix (文字
l
または文字L
) または long-long-suffix (文字シーケンスll
または文字シーケンスLL
) (C99以上)
- unsigned-suffix (文字
[編集] 説明
以下の変数は同じ値に初期化されます。
int d = 42; int o = 052; int x = 0x2a; int X = 0X2A;
[編集] 整数定数の型
整数定数の型は、基数と使用された integer-suffix に応じた、以下の型の一覧の中の、フィットする最初の型になります。
整数定数に対して許容される型 | ||
---|---|---|
接尾辞 | 10進数 | 16進数または8進数 |
接尾辞なし | int
long int |
int
unsigned int |
u または U
|
unsigned int
unsigned long int |
unsigned int
unsigned long int |
l または L
|
long int
unsigned long int(C99未満) |
long int
unsigned long int |
l /L と u /U の両方
|
unsigned long int
unsigned long long int(C99以上) |
unsigned long int
unsigned long long int(C99以上) |
ll または LL
|
long long int(C99以上) | long long int(C99以上)
unsigned long long int(C99以上) |
ll /LL と u /U の両方
|
unsigned long long int(C99以上) | unsigned long long int(C99以上) |
整数定数の値が、接尾辞と基数の組み合わせによって許容されるいずれの型にもフィットしないほど大きく、コンパイラが拡張整数型 (__int128 など) をサポートする場合、そのリテラルは拡張整数型になることがあります。 そうでなければプログラムは ill-formed です。
[編集] ノート
整数定数���の文字は大文字小文字が区別されません。 0xDeAdBaBeU
と 0XdeadBABEu
は同じ数値を表します (ひとつの例外は long-long-suffix です。 ll
または LL
のいずれかであり、 lL
や Ll
は使用できません)。
負の整数定数は存在しません。 -1 などの式は定数の表す値に単項負号演算子を適用します。 これは暗黙の型変換を発生させる場合があります。
#if または #elif の制御式で使用されたときは、すべての符号付き整数定数は intmax_t 型であるかのように振る舞い、すべての符号なし整数定数は uintmax_t 型であるかのように振る舞います。
整数定数は整数定数式で使用できます。
最長一致により、 e
または E
で終わる16進整数定数は、演算子 +
または -
が続くとき、ソース内のホワイトスペースまたは括弧で、その演算子から分離しなければなりません。
int x = 0xE+2; // エラー。 int y = 0xa+2; // OK。 int z = 0xE +2; // OK。 int q = (0xE)+2; // OK。
そうでなければ、単一の無効なプリプロセッサ数値トークンが形成され、その後の解析に失敗します。
[編集] 例
#include <stdio.h> #include <inttypes.h> int main(void) { printf("123 = %d\n", 123); printf("0123 = %d\n", 0123); printf("0x123 = %d\n", 0x123); printf("12345678901234567890ull = %llu\n", 12345678901234567890ull); // たとえ long の接尾辞がなくても、 // 64ビットの型 (unsigned long long (または unsigned long)) になります。 printf("12345678901234567890u = %"PRIu64"\n", 12345678901234567890u ); // printf("%lld\n", -9223372036854775808); // エラー。 // 値 9223372036854775808 は接尾辞なしの10進整数定数が許容される // 最も大きな型である signed long long に収まりません。 printf("%llu\n", -9223372036854775808ull ); // unsigned に負号演算子を適用すると 2^64 からそれを引いた値 // すなわち 9223372036854775808 になります。 printf("%lld\n", -9223372036854775807ull - 1); // 値 -9223372036854775808 を計算するための正しい方法。 }
出力:
123 = 123 0123 = 83 0x123 = 291 12345678901234567890ull = 12345678901234567890 12345678901234567890u = 12345678901234567890 9223372036854775808 -9223372036854775808