Namespaces
Variants

Integer constant

From cppreference.net

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

目次

構文

整数定数は 非左辺値 の形式を持つ式です

decimal-constant integer-suffix  (オプション) (1)
octal-constant integer-suffix  (オプション) (2)
hex-constant integer-suffix  (オプション) (3)
binary-constant integer-suffix  (オプション) (4) (C23以降)

ここで

  • decimal-constant は、非ゼロの10進数字( 1 2 3 4 5 6 7 8 9 )で始まり、その後に0個以上の10進数字( 0 1 2 3 4 5 6 7 8 9 )が続く
  • octal-constant は、数字のゼロ( 0 )で始まり、その後に0個以上の8進数字( 0 1 2 3 4 5 6 7 )が続く
  • hex-constant は、文字シーケンス 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-constant は、文字シーケンス 0b または文字シーケンス 0B で始まり、その後に1個以上の2進数字( 0 1 )が続く
  • integer-suffix は、指定された場合、以下のいずれかを含むことができる(ただし、unsigned接頭辞は他の接尾辞と組み合わせることが可能。2つの接尾辞が使用される場合、それらは任意の順序で現れることができる):
  • unsigned-suffix (文字 u または文字 U )
  • long-suffix (文字 l または文字 L ) または long-long-suffix (文字シーケンス ll または文字シーケンス LL ) (C99以降)
  • bit-precise-int-suffix (文字シーケンス wb または文字シーケンス WB ) (C23以降)

オプションの単一引用符( ' )は、区切り文字として数字の間に挿入できます。これらはコンパイラによって無視されます。

(C23以降)

説明

1) 10進整数定数(基数10、最初の桁が最上位桁)。
2) 8進整数定数(基数8、最初の桁が最上位桁)。
3) 16進整数定数(基数16、最初の桁が最上位、 a から f までの文字は10から15までの10進数値を表します)。
4) バイナリ整数定数(基数2、最初の桁が最上位ビット)。

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

int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;
int b = 0b101010; // C23
**注記**: 提供されたHTMLコードブロック内のテキストは、C++の整数リテラル表記を示すコード例であり、以下の理由から翻訳対象外です: - `
`タグ内のコードは翻訳しないという指示
- C++固有の用語は翻訳しないという指示
- 数値リテラルとコメント「// C23」はコードの一部として保持
コード内容の説明:
- 10進数リテラル:42
- 8進数リテラル:052
- 16進数リテラル:0x2a, 0X2A
- 2進数リテラル:0b101010(C23標準で導入)

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

unsigned long long l1 = 18446744073709550592ull; // C99
unsigned long long l2 = 18'446'744'073'709'550'592llu; // C23
unsigned long long l3 = 1844'6744'0737'0955'0592uLL; // C23
unsigned long long l4 = 184467'440737'0'95505'92LLU; // C23

整数定数の型

整数定数の型は、数値の基数と使用された integer-suffix に依存する型リストにおいて、値が収まる最初の型となります。

整数定数で許可される型
接尾辞 十進法の基数 その他の基数
接尾辞なし int

long int
unsigned long int (C99まで)
long long int (C99以降)

int

unsigned int
long int
unsigned long int
long long int (C99以降)
unsigned long long int (C99以降)

u または U unsigned int

unsigned long int
unsigned long long int (C99以降)

unsigned int

unsigned long int
unsigned long long int (C99以降)

l または L long int

unsigned long int (C99まで)
long long int (C99以降)

long int

unsigned long int
long long int (C99以降)
unsigned long long int (C99以降)

both l / L および u / U unsigned long int

unsigned long long int (C99以降)

unsigned long int

unsigned long long int (C99以降)

ll または LL long long int (C99以降) long long int (C99以降)

unsigned long long int (C99以降)

both ll / LL および u / U unsigned long long int (C99以降) unsigned long long int (C99以降)
wb または WB _BitInt ( N ) 値と符号ビットを格納できる最小のN(1より大きい)を幅とする_BitInt(N) (C23以降) _BitInt ( N ) 値と符号ビットを格納できる最小のN(1より大きい)を幅とする_BitInt(N) (C23以降)
both wb / WB and u / U unsigned _BitInt ( N ) 値が格納可能な0より大きい最小の幅Nを持つ (C23以降) unsigned _BitInt ( N ) 値が格納可能な0より大きい最小の幅Nを持つ (C23以降)

整数定数の値が接尾辞/基数の組み合わせで許可されるいずれの型にも収まらない場合、 接尾辞 wb WB uwb または UWB を持たず (C23以降) コンパイラが拡張整数型(例: __int128 )をサポートしている場合、定数は拡張整数型を与えられる可能性がある。それ以外の場合、プログラムは不適格となる。

注記

整数定数内の文字は大文字小文字を区別しません: 0xDeAdBaBeU 0XdeadBABEu は同じ数値を表します (唯一の例外は long-long-suffix で、 ll または LL のいずれかであり、 lL Ll にはなりません ) (C99以降)

負の整数定数は存在しません。 - 1 のような式は、定数によって表される値に 単項マイナス演算子 を適用します。

#if または #elif の制御式で使用される場合、すべての符号付き整数定数は intmax_t 型を持つかのように動作し、すべての符号なし整数定数は uintmax_t 型を持つかのように動作します。

(C99以降)

整数定数は 整数定数式 で使用できます。

最大マンチ のため、16進整数定数が e または E で終わり、その後に演算子 + または - が続く場合、ソースコード内で空白または括弧を用いて演算子から分離する必要があります:

int x = 0xE+2;   // エラー
int y = 0xa+2;   // OK
int z = 0xE +2;  // OK
int q = (0xE)+2; // OK

それ以外の場合、単一の無効な前処理数トークンが形成され、これにより以降の解析が失敗します。

#include <inttypes.h>
#include <stdio.h>
int main(void)
{
    printf("123 = %d\n", 123);
    printf("0123 = %d\n", 0123);
    printf("0x123 = %d\n", 0x123);
    printf("12345678901234567890ull = %llu\n", 12345678901234567890ull);
    // the type is a 64-bit type (unsigned long long or possibly unsigned long)
    // even without a long suffix
    printf("12345678901234567890u = %"PRIu64"\n", 12345678901234567890u );
    // printf("%lld\n", -9223372036854775808); // Error:
        // the value 9223372036854775808 cannot fit in signed long long, which
        // is the biggest type allowed for unsuffixed decimal integer constant
    printf("%llu\n", -9223372036854775808ull );
    // unary minus applied to unsigned value subtracts it from 2^64,
    // this gives unsigned 9223372036854775808
    printf("%lld\n", -9223372036854775807ll - 1);
    // correct way to form signed value -9223372036854775808
}

出力:

123 = 123
0123 = 83
0x123 = 291
12345678901234567890ull = 12345678901234567890
12345678901234567890u = 12345678901234567890
9223372036854775808
-9223372036854775808

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 6.4.4.1 整数定数 (p: 57-60)
  • C17規格 (ISO/IEC 9899:2018):
  • 6.4.4.1 整数定数 (p: 45-46)
  • C11規格 (ISO/IEC 9899:2011):
  • 6.4.4.1 整数定数 (p: 62-64)
  • C99規格 (ISO/IEC 9899:1999):
  • 6.4.4.1 整数定数 (p: 54-56)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 3.1.3.2 整数定数

関連項目

C++ ドキュメント for Integer literal