名前空間
変種
操作

整数リテラル

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
一般
値カテゴリ (lvalue, rvalue, xvalue)
評価順序 (副作用完了点)
定数式
未評価式
一次式
ラムダ式(C++11)
リテラル
整数リテラル
浮動小数点リテラル
ブーリアンリテラル
文字リテラル および エスケープシーケンス
文字列リテラル
ヌルポインタリテラル(C++11)
ユーザ定義リテラル(C++11)
演算子
代入演算子: a=b, a+=b, a-=b, a*=b, a/=b, a%=b, a&=b, a|=b, a^=b, a<<=b, a>>=b
インクリメントとデクリメント: ++a, --a, a++, a--
算術演算子: +a, -a, a+b, a-b, a*b, a/b, a%b, ~a, a&b, a|b, a^b, a<<b, a>>b
論理演算子: a||b, a&&b, !a
比較演算子: a==b, a!=b, a<b, a>b, a<=b, a>=b, a<=>b(C++20)
メンバアクセス演算子: a[b], *a, &a, a->b, a.b, a->*b, a.*b
その他の演算子: a(...), a,b, a?b:c
デフォルト比較(C++20)
演算子の代替表現
優先順位と結合性
畳み込み式(C++17)
new 式
delete 式
throw 式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
演算子オーバーロード
変換
暗黙の変換
const_cast
static_cast
reinterpret_cast
dynamic_cast
明示的な変換 (T)a, T(a)
ユーザ定義変換
 

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

目次

[編集] 構文

整数リテラルは以下の形式の一次式です。

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以上)
区切り文字として数字の間に任意にシングルクォート (') を挿入しても構いません。 これらはコンパイラに無視されます。 (C++14以上)

[編集] 説明

1) 10進整数リテラル (基数10、最初の桁が最上位)。
2) 8進整数リテラル (基数8、最初の桁が最上位)。
3) 16進整数リテラル (基数16、最初の桁が最上位、文字 'a'〜'f' は値 10〜15 (10進数で) を表します)。
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/Lu/U の両方 unsigned long int

unsigned long long int(C++11以上)

unsigned long int(C++11以上)

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/LLu/U の両方 unsigned long long int(C++11以上) unsigned long long int(C++11以上)

整数リテラルの値が、接尾辞と基数の組み合わせによって許容されるいずれの型にもフィットしないほど大きく、コンパイラが拡張整数型 (__int128 など) をサポートする場合、そのリテラルは拡張整数型になることがあります。 そうでなければプログラムは ill-formed です。

[編集] ノート

整数リテラル内の文字は大文字小文字が区別されません。 0xDeAdBeEfU0XdeadBEEFu は同じ数値を表します (ひとつの例外は long-long-suffix です。 ll または LL のいずれかであり、 lLLl は使用できません)。

負の整数リテラルは存在しません。 -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;   // error
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'; // 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
}

出力:

123
83
291
2
12345678901234567890
12345678901234567890
9223372036854775808
-9223372036854775808

[編集] 関連項目

整数定数C言語リファレンス