名前空間
変種
操作

整数リテラル

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
真偽値 - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

整数型の値を式中で直接使用できるようにします。

目次

[編集] 構文

整数リテラルは以下の形式をとります。

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以降)
  • size-suffix (文字 `z` または文字 `Z`)
(C++23から)

オプションのシングルクォーテーション (') は、セパレータとして数字の間に挿入できます。これらはリテラルの値を決定する際には無視されます。

(C++14以降)

整数リテラル(任意のリテラルと同様に)は、主式です。

[編集] 説明

1) 10進整数リテラル (基数10)。
2) 8進整数リテラル (基数8)。
3) 16進整数リテラル (基数16。文字'a'から'f'は、値(10進数)10から15を表します)。
4) 2進整数リテラル (基数2)。

整数リテラルの最初の桁が最上位です。

例。以下の変数は同じ値で初期化されます。

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
  • long int
  • long long int (C++11以降)
  • int
  • unsigned int
  • long int
  • unsigned long int
  • long long int (C++11以降)
  • unsigned long long int (C++11以降)
u または U
  • unsigned int
  • unsigned long int
  • unsigned long long int (C++11以降)
  • unsigned int
  • unsigned long int
  • unsigned long long int (C++11以降)
l または L
  • long int
  • unsigned long int (C++11まで)
  • long long int (C++11以降)
  • long int
  • unsigned long int
  • long long int (C++11以降)
  • unsigned long long int (C++11以降)
l/L の両方
u/U
  • unsigned long int
  • unsigned long long int (C++11以降)
  • unsigned long int
  • unsigned long long int (C++11以降)
ll または LL
  • long long int (C++11以降)
  • long long int (C++11以降)
  • unsigned long long int (C++11以降)
ll/LL の両方
u/U
  • unsigned long long int (C++11以降)
  • unsigned long long int (C++11以降)
z または Z
  • std::size_tの符号付きバージョン (C++23以降)
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ドキュメント
English 日本語 中文(简体) 中文(繁體)