C 標準(C99/C11/C17)對整數型別僅做最小位寬與相對大小保證:
int:至少 16 位,通常代表目標架構的「自然字長」(最高效的整數運算單元)。long:至少 32 位,且 sizeof(long) >= sizeof(int)。long long (C99+):至少 64 位。標準不保証具體位寬,僅保證範圍:`INT_MIN` ~ `INT_MAX`、`LONG_MIN` ~ `LONG_MAX`(定義於 `
| 平台 / ABI | int | long | 指標 | 資料模型 |
|---|---|---|---|---|
| 16-bit 實模式 (DOS, 8086) | 16 | 32 | 16/32 | IP16 |
| 32-bit x86 (Linux/Windows) | 32 | 32 | 32 | ILP32 |
| 64-bit Linux/macOS/BSD (System V AMD64 ABI) | 32 | 64 | 64 | LP64 |
| 64-bit Windows (Microsoft x64 ABI) | 32 | 32 | 64 | LLP64 |
| 嵌入式 32-bit ARM (ARM EABI) | 32 | 32 | 32 | ILP32 |
| 嵌入式 64-bit ARM (AArch64) | 32 | 64 | 64 | LP64 |
自 C99 起,`
#include
int32_t i32; // 精確 32 位有號整數
uint64_t u64; // 精確 64 位無號整數
int_least32_t at_least_32; // 至少 32 位
int_fast16_t fast_16; // 至少 16 位且運算最快
intptr_t ptr_sized; // 能容納指標的有號整數
uintptr_t uptr_sized; // 能容納指標的無號整數
size_t sz; // 物件大小(無號)
ptrdiff_t diff; // 指標差值(有號)
`int` 是「機器字長」,`long` 歷史上是「擴展整數」,現代 64 位系統分裂為 LP64 (Unix) 與 LLP64 (Windows)。編寫可移植、健壯、高效的 C 代碼,請拋棄對 `int`/`long` 具體位寬的假設,全面擁抱 `