整数定数
整数型の値を式の中で直接使用できるようにします。
構文
整数定数は以下の形式の非左辺値式です。
| 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
|
int
|
u または U
|
unsigned int
|
unsigned int
|
l または L
|
long int
|
long int
|
l/L と u/U の両方
|
unsigned long int
|
unsigned long int
|
ll または LL
|
long long int(C99以上)
|
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
参考文献
- C11 standard (ISO/IEC 9899:2011):
- 6.4.4.1 Integer constants (p: 62-64)
- C99 standard (ISO/IEC 9899:1999):
- 6.4.4.1 Integer constants (p: 54-56)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.1.3.2 Integer constants
関連項目
整数リテラル の C++リファレンス
|