整數常數
允許在表達式中直接使用整數型別的值。
目錄 |
[編輯] 語法
整數常數是一種非左值 (non-lvalue) 表達式,形式如下:
| 十進制常數 整數後綴 (選填) | (1) | ||||||||
| 八進制常數 整數後綴 (選填) | (2) | ||||||||
| 十六進制常數 整數後綴 (選填) | (3) | ||||||||
| 二進制常數 整數後綴 (選填) | (4) | (C23 起) | |||||||
其中
- 十進制常數 為非零的十進制數字(
1、2、3、4、5、6、7、8、9),後接零個或多個十進制數字(0、1、2、3、4、5、6、7、8、9) - 八進制常數 為數字零(
0)後接零個或多個八進制數字(0、1、2、3、4、5、6、7) - 十六進制常數 為字元序列
0x或0X,後接一個或多個十六進制數字(0、1、2、3、4、5、6、7、8、9、a、A、b、B、c、C、d、D、e、E、f、F) - 二進制常數 為字元序列
0b或0B,後接一個或多個二進制數字(0、1) - 整數後綴(若提供)可包含以下項目之一(無符號前綴可與其他後綴結合;若使用兩個後綴,順序不拘)
- 無符號後綴(字元
u或U) - 長整數後綴(字元
l或L) 或 長長整數後綴(字元序列ll或LL)(C99 起) - 精確位元整數後綴(字元序列
wb或WB) (C23 起)
- 無符號後綴(字元
|
可選的單引號( |
(C23 起) |
[編輯] 說明
a 至 f 代表十進制數值 10 至 15)。以下變數初始化為相同值
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 |
int
unsigned int |
u 或 U |
unsigned int
unsigned long int |
unsigned int
unsigned long int |
l 或 L |
long int
unsigned long int(C99 前) |
long int
unsigned long int |
同時包含 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 起) |
同時包含 ll/LL 與 u/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/WB 與 u/U |
unsigned _BitInt(N),其中寬度 N 是大於 0 且能容納該數值的最小 N 值(C23 起) | unsigned _BitInt(N),其中寬度 N 是大於 0 且能容納該數值的最小 N 值(C23 起) |
若整數常數的值太大,無法放入任何後綴/基數組合允許的型別中,且不具備 wb、WB、uwb 或 UWB 後綴(C23 起),且編譯器支援擴充整數型別(如 __int128),則該常數可被賦予擴充整數型別;否則程式格式錯誤 (ill-formed)。
[編輯] 附註
整數常數中的字母不區分大小寫:0xDeAdBaBeU 與 0XdeadBABEu 代表相同的數值(例外為長長整數後綴,其必須為 ll 或 LL,不可為 lL 或 Ll)(C99 起)。
沒有負整數常數。諸如 -1 的表達式是將單元負號運算子應用於該常數所表示的值。
|
當用於 #if 或 #elif 的控制表達式時,所有有符號整數常數的行為如同具有 intmax_t 型別,所有無符號整數常數的行為如同具有 uintmax_t 型別。 |
(自 C99 起) |
整數常數可用於整數常數表達式。
由於最大咬合規則 (maximal munch),以 e 或 E 結尾的十六進制整數常數在後接 + 或 - 運算子時,必須在原始程式碼中使用空白字元或括號將運算子隔開。
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++ 文件 關於 整數字面量
|