名前空間
変種
操作

整数定数

提供: cppreference.com
< c‎ | language

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

目次

[編集] 構文

整数定数は以下の形式の非左辺値式です。

decimal-constant integer-suffix(オプション) (1)
octal-constant integer-suffix(オプション) (2)
hex-constant integer-suffix(オプション) (3)

ただし

  • 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) が続いたものです。
  • integer-suffix (もしあれば) は、以下のいずれかまたは両方を含んでも構いません (両方の場合、いずれの順序でも構いません)。
  • unsigned-suffix (文字 u または文字 U)
  • long-suffix (文字 l または文字 L) または long-long-suffix (文字シーケンス ll または文字シーケンス LL) (C99以上)

[編集] 説明

1) 10進整数定数 (基数10、最初の桁が最上位)。
2) 8進整数定数 (基数8、最初の桁が最上位)。
3) 16進整数定数 (基数16、最初の桁が最上位、文字「a」〜「f」は値 10〜15 (10進数で) を表します)。

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

int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;

[編集] 整数定数の型

整数定数の型は、基数と使用された integer-suffix に応じた、以下の型の一覧の中の、フィットする最初の型になります。

整数定数に対して許容される型
接尾辞 10進数 16進数または8進数
接尾辞なし 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以上)

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

[編集] ノート

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

負の整数定数は存在しません。 -1 などの式は定数の表す値に単項負号演算子を適用します。 これは暗黙の型変換を発生させる場合があります。

#if または #elif の制御式で使用されたときは、すべての符号付き整数定数は intmax_t 型であるかのように振る舞い、すべての符号なし整数定数は uintmax_t 型であるかのように振る舞います。

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

最長一致により、 e または E で終わる16進整数定数は、演算子 + または - が続くとき、ソース内のホワイトスペースまたは括弧で、その演算子から分離しなければなりません。

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

そうでなければ、単一の無効なプリプロセッサ数値トークンが形成され、その後の解析に失敗します。

[編集]

#include <stdio.h>
#include <inttypes.h>
int main(void)
{
    printf("123 = %d\n", 123);
    printf("0123 = %d\n", 0123);
    printf("0x123 = %d\n", 0x123);
    printf("12345678901234567890ull = %llu\n", 12345678901234567890ull);
    // たとえ long の接尾辞がなくても、
    // 64ビットの型 (unsigned long long (または unsigned long)) になります。
    printf("12345678901234567890u = %"PRIu64"\n", 12345678901234567890u );
 
//  printf("%lld\n", -9223372036854775808); // エラー。
    // 値 9223372036854775808 は接尾辞なしの10進整数定数が許容される
    // 最も大きな型である signed long long に収まりません。
 
    printf("%llu\n", -9223372036854775808ull );
    // unsigned に負号演算子を適用すると 2^64 からそれを引いた値
    // すなわち 9223372036854775808 になります。
 
    printf("%lld\n", -9223372036854775807ull - 1);
    // 値 -9223372036854775808 を計算するための正しい方法。
}

出力:

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

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 6.4.4.1 Integer constants (p: 62-64)
  • C99 standard (ISO/IEC 9899:1999):
  • 6.4.4.1 Integer constants (p: 54-56)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 3.1.3.2 Integer constants

[編集] 関連項目

整数リテラルC++リファレンス