名前空間
変種
操作

整数定数

From cppreference.com
< c‎ | language

整数型の値を直接式で使用できます。

目次

[編集] 構文

整数定数は、次の形式の非左辺値式です。

10進数定数 整数サフィックス (オプション) (1)
8進数定数 整数サフィックス (オプション) (2)
16進数定数 整数サフィックス (オプション) (3)
2進数定数 整数サフィックス (オプション) (4) (C23以降)

ここで、

  • 10進数定数 は、0以外の10進数字(123456789)に続いて、0個以上の10進数字(0123456789)が続いたものです。
  • 8進数定数 は、数字のゼロ(0)に続いて、0個以上の8進数字(01234567)が続いたものです。
  • 16進数定数 は、文字シーケンス0xまたは文字シーケンス0Xに続いて、1つ以上の16進数字(0123456789aAbBcCdDeEfF)が続いたものです。
  • 2進数定数 は、文字シーケンス0bまたは文字シーケンス0Bに続いて、1つ以上の2進数字(01)が続いたものです。
  • 整数サフィックス は、指定されている場合、次のいずれかを含みます(ただし、unsignedプレフィックスは他のもののいずれかと組み合わせることができます。2つのサフィックスが使用される場合、それらは任意の順序で出現できます)。
  • unsignedサフィックス (文字uまたは文字U
  • longサフィックス (文字lまたは文字Lまたは long-longサフィックス (文字シーケンスllまたは文字シーケンスLL(C99以降)
  • ビット精度整数サフィックス (文字シーケンスwbまたは文字シーケンスWB(C23以降)

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

(C23以降)

[編集] 説明

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; // 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

[編集] 整数定数の型

整数定数の型は、使用された数値基数と整数サフィックスによって決まる型のリストの中から、値が適合する最初の型です。

整数定数に許可される型
suffix 10進基数 その他の基数
サフィックスなし 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以降)

l/Lu/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以降)

ll/LLu/U の両方 unsigned long long int(C99以降) unsigned long long int(C99以降)
wb または WB _BitInt(N)、ここで幅Nは、値と符号ビットを格納できる1より大きい最小のNです(C23以降) _BitInt(N)、ここで幅Nは、値と符号ビットを格納できる1より大きい最小のNです(C23以降)
wb/WBu/U の両方 unsigned _BitInt(N)、ここで幅Nは、値を格納できる0より大きい最小のNです(C23以降) unsigned _BitInt(N)、ここで幅Nは、値を格納できる0より大きい最小のNです(C23以降)

整数定数の値が、サフィックス/基数の組み合わせによって許可されるどの型にも収まらないほど大きい場合、サフィックスwbWBuwb、またはUWBを持ちません(C23以降)、かつコンパイラが拡張整数型(__int128など)をサポートしている場合、定数は拡張整数型を持つことができます。それ以外の場合、プログラムは不正な形式となります。

[編集] 注記

整数定数内の文字は、大文字と小文字を区別しません。0xDeAdBaBeU0XdeadBABEuは同じ数値を表します(1つの例外はlong-longサフィックスで、llまたはLLのいずれかであり、lLLlではありません)(C99以降)

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

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

(C99以降)

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

最大マッチャーにより、eEで終わる16進整数定数は、+または-演算子の後に続く場合、ソースで空白または括弧で演算子から区切る必要があります。

int x = 0xE+2;   // error
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 Integer constants (p: 57-60)
  • C17標準 (ISO/IEC 9899:2018)
  • 6.4.4.1 Integer constants (p: 45-46)
  • C11標準 (ISO/IEC 9899:2011)
  • 6.4.4.1 Integer constants (p: 62-64)
  • C99標準 (ISO/IEC 9899:1999)
  • 6.4.4.1 Integer constants (p: 54-56)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 3.1.3.2 Integer constants

[編集] 関連項目

C++ドキュメント整数リテラル
English 日本語 中文(简体) 中文(繁體)