命名空間
變體
動作

整數常數

出自 cppreference.com
< c‎ | 語言

允許在表達式中直接使用整數型別的值。

目錄

[編輯] 語法

整數常數是一種非左值 (non-lvalue) 表達式,形式如下:

十進制常數 整數後綴 (選填) (1)
八進制常數 整數後綴 (選填) (2)
十六進制常數 整數後綴 (選填) (3)
二進制常數 整數後綴 (選填) (4) (C23 起)

其中

  • 十進制常數 為非零的十進制數字(123456789),後接零個或多個十進制數字(0123456789
  • 八進制常數 為數字零(0)後接零個或多個八進制數字(01234567
  • 十六進制常數 為字元序列 0x0X,後接一個或多個十六進制數字(0123456789aAbBcCdDeEfF
  • 二進制常數 為字元序列 0b0B,後接一個或多個二進制數字(01
  • 整數後綴(若提供)可包含以下項目之一(無符號前綴可與其他後綴結合;若使用兩個後綴,順序不拘)
  • 無符號後綴(字元 uU
  • 長整數後綴(字元 lL長長整數後綴(字元序列 llLL(C99 起)
  • 精確位元整數後綴(字元序列 wbWB(C23 起)

可選的單引號(')可插入數字之間作為分隔符。編譯器會忽略它們。

(C23 起)

[編輯] 說明

1) 十進制整數常數(基數 10,第一位數字為最高有效位)。
2) 八進制整數常數(基數 8,第一位數字為最高有效位)。
3) 十六進制整數常數(基數 16,第一位數字為最高有效位,字母 af 代表十進制數值 10 至 15)。
4) 二進制整數常數(基數 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 十進制基數 其他基數
無後綴 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 起)

uU unsigned int

unsigned long int
unsigned long long int(C99 起)

unsigned int

unsigned long int
unsigned long long int(C99 起)

lL 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 起)

llLL 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 起)
wbWB _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 起)

若整數常數的值太大,無法放入任何後綴/基數組合允許的型別中,且不具備 wbWBuwbUWB 後綴(C23 起),且編譯器支援擴充整數型別(如 __int128),則該常數可被賦予擴充整數型別;否則程式格式錯誤 (ill-formed)。

[編輯] 附註

整數常數中的字母不區分大小寫:0xDeAdBaBeU0XdeadBABEu 代表相同的數值(例外為長長整數後綴,其必須為 llLL,不可為 lLLl(C99 起)

沒有負整數常數。諸如 -1 的表達式是將單元負號運算子應用於該常數所表示的值。

當用於 #if#elif 的控制表達式時,所有有符號整數常數的行為如同具有 intmax_t 型別,所有無符號整數常數的行為如同具有 uintmax_t 型別。

(自 C99 起)

整數常數可用於整數常數表達式

由於最大咬合規則 (maximal munch),以 eE 結尾的十六進制整數常數在後接 +- 運算子時,必須在原始程式碼中使用空白字元或括號將運算子隔開。

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 整數常數 (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++ 文件 關於 整數字面量
English Deutsch 日本語 한국어 中文(简体) 中文(繁體)