Namespaces
Variants

Integer literal

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

目次

構文

整数リテラルは以下の形式を持ちます

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-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)。

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

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

int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;
int b = 0b101010; // C++14
**注記**: 提供されたHTMLコンテンツは、C++のコードサンプルとコメントのみを含んでおり、翻訳対象となる自然言語テキストが含まれていません。C++のキーワード、リテラル値、構文、およびコメント内の「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 に依存する型リストにおいて、値が収まる最初の型となります:

サフィックス 十進法基数 二進法、八進法、または十六進法基数
(接尾辞なし)
  • 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以降)
both l / L
and 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以降)
both ll / LL
and u / U
  • unsigned long long int (C++11以降)
  • unsigned long long int (C++11以降)
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