基本整型 int 在 C 標準中僅保證「至少 16 位元」,實際寬度隨編譯器/平台而異(16/32/64 位元)。為了精確控制資料範圍、記憶體佔用與可移植性,C 提供 short、long、signed、unsigned 四大修飾符,組合出豐富的整型家族。
| 類型名稱 | 別名 | 最小位元寬度 | 典型範圍 (補碼) | 格式字串 |
|---|---|---|---|---|
signed char | 8 | -128 ~ 127 | %hhd | |
unsigned char | 8 | 0 ~ 255 | %hhu | |
short / signed short | short int | 16 | -32,768 ~ 32,767 | %hd |
unsigned short | unsigned short int | 16 | 0 ~ 65,535 | %hu |
int / signed int | 16 | -32,768 ~ 32,767 (16位) / -2^31 ~ 2^31-1 (32位) | %d | |
unsigned int | unsigned | 16 | 0 ~ 65,535 / 0 ~ 2^32-1 | %u |
long / signed long | long int | 32 | -2^31 ~ 2^31-1 | %ld |
unsigned long | 32 | 0 ~ 2^32-1 | %lu | |
long long / signed long long | (C99) | 64 | -2^63 ~ 2^63-1 | %lld |
unsigned long long | (C99) | 64 | 0 ~ 2^64-1 | %llu |
sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)
標準僅保證相對關係,不固定絕對大小。例如:
short=2, int=4, long=4, long long=8short=2, int=4, long=8, long long=8short=2, int=2, long=4, long long=8<stdint.h> / <cstdint>跨平台專案**強烈建議**使用精確寬度型別:
int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t
int_leastN_t // 至少 N 位,最快
int_fastN_t // 至少 N 位,最快
intptr_t, uintptr_t // 能容納指標的整型
intmax_t, uintmax_t // 最大寬度整型
| 進制 | 前綴 | 範例 | 後綴 (型別) |
|---|---|---|---|
| 八進制 | 0 | 0755 | U (unsigned), L (long), LL (long long) |
| 十六進制 | 0x / 0X | 0xFF, 0Xdeadbeef | 同上,大小寫皆可 |
| 十進制 | 無 | 123, -456 | 同上 |
| 二進制 | 0b / 0B (C++14 / GNU 擴展) | 0b1010 | 同上 |
無後綴時,編譯器按 int → long → long long 首個能容納的型別推導;帶 U 則走 unsigned 族系。
unsigned int u = 10;
int i = -5;
if (u + i > 0) ... // i 隱式轉 unsigned,結果變巨大正數 → 條件永真
鐵律:避免有號/無號直接比較或運算;必要時顯式 static_cast 統一型別。
sizeof(type) / sizeof expr 返回**位元組數** (1 byte = CHAR_BIT 位,通常 8)。%zu 格式化 size_t。int 做迴圈計數、索引;需要明確範圍改用 int32_t/int64_t。uint32_t 等固定寬度無號型別。size_t(無號、與指標同寬)。int32_t/int64_t + 網路位元組序(htonl/ntohl)。-Wconversion -Wsign-compare -Wshorten-64-to-32 捕捉隱式縮窄/符號轉換。理解整型修飾符的組合規則、寬度保證與平台差異,是寫出可移植、無溢位、高效能 C/C++ 程式的基石。善用 <cstdint> 固定寬度型別,讓「在這裡編譯、到處執行」不再是口號。