整数リテラル
整数型の値を式の中で直接使用できるようにします。
構文
整数リテラルは以下の形式の一次式です。
| decimal-literal integer-suffix(オプション) | (1) | ||||||||
| octal-literal integer-suffix(オプション) | (2) | ||||||||
| hex-literal integer-suffix(オプション) | (3) | ||||||||
| binary-literal integer-suffix(オプション) | (4) | (C++14以上) | |||||||
ただし
- decimal-literal はゼロ以外の10進数字 (
1,2,3,4,5,6,7,8,9) に0個以上の10進数字 (0,1,2,3,4,5,6,7,8,9) が続いたものです。 - octal-literal は数字のゼロ (
0) に0個以上の8進数字 (0,1,2,3,4,5,6,7) が続いたものです。 - hex-literal は文字シーケンス
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) が続いたものです。 - binary-literal は文字シーケンス
0bまたは文字シーケンス0Bに1個以上の2進数字 (0,1) が続いたものです。 - integer-suffix (もしあれば) は、以下のいずれかまたは両方を含んでも構いません (両方の場合、いずれの順序でも構いません)。
- unsigned-suffix (文字
uまたは文字U) - long-suffix (文字
lまたは文字L) または long-long-suffix (文字シーケンスllまたは文字シーケンスLL) (C++11以上)
- unsigned-suffix (文字
区切り文字として数字の間に任意にシングルクォート (') を挿入しても構いません。 コンパイラはそれらを無視されます。 |
(C++14以上) |
説明
以下の変数は同じ値に初期化されます。
int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;
int b = 0b101010; // C++14
以下の変数も同じ値に初期化されます。
unsigned long long l1 = 18446744073709550592ull; // C++11
unsigned long long l2 = 18'446'744'073'709'550'592llu; // C++14
unsigned long long l3 = 1844'6744'0737'0955'0592uLL; // C++14
unsigned long long l4 = 184467'440737'0'95505'92LLU; // C++14
リテラルの型
整数リテラルの型は、基数と使用された integer-suffix に応じた、以下の型の一覧の中の、フィットする最初の型になります。
| 整数リテラルのために許容される型 | ||
|---|---|---|
| 接尾辞 | 10進数 | 2進数、8進数、16進数 |
| 接尾辞なし | int
|
int
|
u または U
|
unsigned int
|
unsigned int
|
l または L
|
long int
|
long int
|
l/L と u/U の両方
|
unsigned long int
|
unsigned long int(C++11以上)
|
ll または LL
|
long long int(C++11以上)
|
long long int(C++11以上)
|
ll/LL と u/U の両方
|
unsigned long long int(C++11以上)
|
unsigned long long int(C++11以上)
|
整数リテラルの値が、接尾辞と基数の組み合わせによって許容されるいずれの型にもフィットしないほど大きく、コンパイラが拡張整数型 (__int128 など) をサポートする場合、そのリテラルは拡張整数型になることがあります。 そうでなければプログラムは ill-formed です。
ノート
整数リテラル内の文字は大文字小文字が区別されません。 0xDeAdBeEfU と 0XdeadBEEFu は同じ数値を表します (ひとつの例外は long-long-suffix です。 ll または LL のいずれかであり、 lL や Ll は使用できません)。
負の整数リテラルは存在しません。 -1 などの式はリテラルの表す値に単項負号演算子を適用します。 これは暗黙の型変換を発生させる場合があります。
C99 より前の C では (C++ ではありません)、 long int に収まらない接尾辞のない10進数値は unsigned long int 型となることが許容されていました。
#if または #elif の制御式で使用されたときは、すべての符号付き整数リテラルは std::intmax_t 型であるかのように振る舞い、すべての符号なし整数リテラルは std::uintmax_t 型であるかのように振る舞います。
貪欲なマッチにより、 e または E で終わる16進整数リテラルは、演算子 + または - が続くとき、ソース内のホワイトスペースまたは括弧で、その演算子から分離しなければなりません。
auto x = 0xE+2.0; // エラー
auto y = 0xa+2.0; // OK
auto z = 0xE +2.0; // OK
auto q = (0xE)+2.0; // OK
そうでなければ、単一の無効なプリプロセッサ数値トークンが形成され、その後の解析に失敗します。
例
#include <iostream>
int main()
{
std::cout << 123 << '\n'
<< 0123 << '\n'
<< 0x123 << '\n'
<< 0b10 << '\n'
<< 12345678901234567890ull << '\n'
<< 12345678901234567890u << '\n'; // たとえ long long の接尾辞がなくても
// unsigned long long 型になります。
// std::cout << -9223372036854775808 << '\n'; // エラー、値 9223372036854775808 は
// 接尾辞なしの10進整数リテラルが許容される
// 最も大きな型である signed long long に
// 収まりません。
std::cout << -9223372036854775808u << '\n'; // unsigned に負号演算子を適用すると
// 2^64 からそれを引いた値すなわち
// 9223372036854775808 になります。
std::cout << -9223372036854775807 - 1 << '\n'; // 値 -9223372036854775808 を
// 計算するための正しい方法。
}
出力:
123
83
291
2
12345678901234567890
12345678901234567890
9223372036854775808
-9223372036854775808
関連項目
| ユーザ定義リテラル(C++11) | ユーザ定義の接尾辞を持つリテラル |
整数定数 の C言語リファレンス
| |