整数リテラル
整数型の値を式中で直接使用できるようにします。
目次 |
[編集] 構文
整数リテラルは以下の形式をとります。
| 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`)
|
(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に依存する型のリストから、値が収まる最初の型になります。
| 接尾辞 | 10進数基数 | 2進数、8進数、または16進数基数 |
|---|---|---|
| (接尾辞なし) |
|
|
u または U |
|
|
l または L |
|
|
l/L の両方と u/U |
|
|
ll または LL |
|
|
ll/LL の両方と u/U |
|
|
z または Z |
|
|
z/Z の両方と u/U |
|
|
整数リテラルの値(size-suffixを持たないもの)(C++23以降)が、接尾辞/基数の組み合わせによって許容されるいずれの型にも収まらず、コンパイラがリテラルの値を表現できる拡張整数型(__int128など)をサポートしている場合、そのリテラルにはその拡張整数型が与えられます。そうでない場合、プログラムは形式を誤っています。
[編集] 注釈
整数リテラル内の文字は大文字と小文字を区別しません: `0xDeAdBeEfU` と `0XdeadBEEFu` は同じ数値を表します(例外はlong-long-suffixで、これは`ll`または`LL`であり、`lL`や`Ll`ではありません)(C++11以降)。
負の整数リテラルはありません。-1のような式は、リテラルが表す値に単項マイナス演算子を適用します。これには暗黙的な型変換が関与する場合があります。
C99以前のC(ただしC++ではない)では、`long int`に収まらない接尾辞なしの10進数の値は、`unsigned long int`型を持つことが許されていました。
|
#if または #elif の制御式で使用される場合、すべての符号付き整数定数はstd::intmax_t型であるかのように振る舞い、すべての符号なし整数定数はstd::uintmax_t型であるかのように振る舞います。 |
(C++11以降) |
最長一致のため、`e` および `E` で終わる16進整数リテラルが、演算子`+`または`-`の後に続く場合、ソースコード内で空白または括弧で演算子と分離する必要があります。
auto x = 0xE+2.0; // error 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'; // the type is unsigned long long // even without a long long suffix // std::cout << -9223372036854775808 << '\n'; // error: the value // 9223372036854775808 cannot fit in signed long long, which is the // biggest type allowed for unsuffixed decimal integer literal std::cout << -9223372036854775808u << '\n'; // unary minus applied to unsigned // value subtracts it from 2^64, this gives 9223372036854775808 std::cout << -9223372036854775807 - 1 << '\n'; // correct way to calculate // the value -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 standard (ISO/IEC 14882:2020)
- 5.13.2 整数リテラル [lex.icon]
- C++17 standard (ISO/IEC 14882:2017)
- 5.13.2 整数リテラル [lex.icon]
- C++14 standard (ISO/IEC 14882:2014)
- 2.14.2 整数リテラル [lex.icon]
- C++11 standard (ISO/IEC 14882:2011)
- 2.14.2 整数リテラル [lex.icon]
- C++98 標準 (ISO/IEC 14882:1998)
- 2.13.1 整数リテラル [lex.icon]
[編集] 関連項目
| ユーザー定義リテラル(C++11) | ユーザー定義サフィックス付きリテラル |
| 整数定数に関するCドキュメント
| |