Integer literal
整数型の値を式内で直接使用できるようにします。
目次 |
構文
整数リテラルは以下の形式を持ちます
| 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 は、指定される場合、以下の1つまたは両方を含むことができる(両方が指定される場合、それらは任意の順序で現れる可能性がある):
-
-
unsigned-suffix
(文字
uまたは文字U) - 以下のいずれか
-
-
long-suffix
(文字
lまたは文字L)
-
long-suffix
(文字
-
unsigned-suffix
(文字
|
(C++11以降) |
|
(C++23以降) |
|
オプションの単一引用符 ( ' ) を数字の間に区切り文字として挿入できます。これらはリテラルの値を決定する際に無視されます。 |
(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 に依存する型リストにおいて、値が収まる最初の型となります:
| サフィックス | 十進法基数 | 二進法、八進法、または十六進法基数 |
|---|---|---|
| (接尾辞なし) |
|
|
u
または
U
|
|
|
l
または
L
|
|
|
both
l
/
L
and
u
/
U
|
|
|
ll
または
LL
|
|
|
both
ll
/
LL
and
u
/
U
|
|
|
z
または
Z
|
|
|
both
z
/
Z
and
u
/
U
|
|
|
整数リテラルの値が サイズ接尾辞を持たない size-suffix (C++23以降) 場合、その値が接尾辞/基数の組み合わせで許可されるいずれの型にも収まらず、かつコンパイラがそのリテラルの値を表現できる拡張整数型(例: __int128 など)をサポートしている場合、そのリテラルは拡張整数型を与えられる可能性があります — そうでない場合、プログラムは不適格となります。
注記
整数リテラル内の文字は大文字小文字を区別しません:
0xDeAdBeEfU
と
0XdeadBEEFu
は同じ数値を表します
(例外の一つは
long-long-suffix
で、
ll
または
LL
のいずれかであり、
lL
や
Ll
にはなりません)
(C++11以降)
。
負の整数リテラルは存在しません。 - 1 のような式は、リテラルが表す値に 単項マイナス演算子 を適用しており、暗黙の型変換が行われる可能性があります。
C99以前のC言語では(ただしC++では除く)、サフィックスなしの10進数値で long int に収まらない値は unsigned long int 型を持つことが許可されています。
|
#if または #elif の制御式で使用される場合、すべての符号付き整数定数は std::intmax_t 型を持つかのように動作し、すべての符号なし整数定数は std::uintmax_t 型を持つかのように動作します。 |
(C++11以降) |
maximal munch
の規則により、16進整数リテラルが
e
または
E
で終わり、その後に演算子
+
または
-
が続く場合、ソースコード内で空白または括弧を用いて演算子から分離する必要があります:
auto x = 0xE+2.0; // エラー auto y = 0xa+2.0; // OK auto z = 0xE +2.0; // OK auto q = (0xE)+2.0; // OK
それ以外の場合、単一の無効なプリプロセス番号トークンが形成され、それ以降の解析が失敗します。
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_binary_literals
|
201304L
|
(C++14) | バイナリリテラル |
__cpp_size_t_suffix
|
202011L
|
(C++23) | std::size_t とその符号付きバージョンのリテラルサフィックス |
例
#include <cstddef> #include <iostream> #include <type_traits> int main() { std::cout << 123 << '\n' << 0123 << '\n' << 0x123 << '\n' << 0b10 << '\n' << 12345678901234567890ull << '\n' << 12345678901234567890u << '\n'; // 型は unsigned long long // long long サフィックスがなくても // std::cout << -9223372036854775808 << '\n'; // エラー: 値 // 9223372036854775808 は符号付き long long に収まらない // これはサフィックスなし10進整数リテラルで許可される最大の型 std::cout << -9223372036854775808u << '\n'; // 単項マイナスが符号なし値に // 適用され、2^64から減算される。これにより 9223372036854775808 が得られる std::cout << -9223372036854775807 - 1 << '\n'; // 値 -9223372036854775808 を // 計算する正しい方法 #if __cpp_size_t_suffix >= 202011L // C++23 static_assert(std::is_same_v<decltype(0UZ), std::size_t>); static_assert(std::is_same_v<decltype(0Z), std::make_signed_t<std::size_t>>); #endif }
出力:
123 83 291 2 12345678901234567890 12345678901234567890 9223372036854775808 -9223372036854775808
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| CWG 2698 | C++23 | size-suffix を持つ整数リテラルは拡張整数型を持つ可能性があった | 大きすぎる場合は不適格 |
参考文献
- C++23標準 (ISO/IEC 14882:2024):
-
- 5.13.2 整数リテラル [lex.icon]
- C++20規格 (ISO/IEC 14882:2020):
-
- 5.13.2 整数リテラル [lex.icon]
- C++17 標準 (ISO/IEC 14882:2017):
-
- 5.13.2 整数リテラル [lex.icon]
- C++14標準 (ISO/IEC 14882:2014):
-
- 2.14.2 整数リテラル [lex.icon]
- C++11標準 (ISO/IEC 14882:2011):
-
- 2.14.2 整数リテラル [lex.icon]
- C++98標準 (ISO/IEC 14882:1998):
-
- 2.13.1 整数リテラル [lex.icon]
関連項目
| user-defined literals (C++11) | ユーザー定義サフィックスを持つリテラル |
|
C documentation
for
integer constant
|
|