「int 反映宿主機器整數的自然大小。」
這句話乍看合理,卻引出更根本的問題:什麼是「自然大小」?誰決定的?
/* /usr/include/limits.h 片段 */
#define INT_MIN (-2147483647 - 1) // -2³¹
#define INT_MAX 2147483647 // 2³¹ - 1
32 位元系統上 int 佔 4 bytes (32 bits),但這只是結果,非原因。
字長 = CPU 一次處理的位元數 = 通用暫存器位寬 = 資料匯流排寬度 = 位址匯流排寬度 (早期架構)
| 元件 | 位寬來源 | 影響 | |
|---|---|---|---|
| 通用暫存器 | ALU 運算位寬 | 整數運算、暫存中間結果 | |
| 資料匯流排 | CPU-記憶體傳輸寬度 | 單次讀寫位元數,決定 sizeof(int) 搬運效率 | |
| 位址匯流排 | 可定址記憶體大小 | 32 bits → 4 GiB;64 bits → 16 EiB |
| 架構 | 字長 | sizeof(int) | 原因 |
|---|---|---|---|
| x86-64 Linux | 64 bits | 4 bytes | LP64 模型保持 int 32-bit 相容 |
| x86-64 Windows | 64 bits | 4 bytes | LLP64 模型,long 仍 32-bit |
| DSP / 微控制器 | 16/32 bits | 16/32 bits | 視 ALU 寬度而定 |
結論:int 大小由 ABI 決定,通常等於或小於字長,以平衡效率與相容性。
<stdint.h> 的 int32_t、int64_t、uintptr_t。sizeof(int) == sizeof(void*) 在 64-bit 系統不成立。long 或 intptr_t) 減少轉換指令。int 範圍的決定鏈:
CPU 字長 (暫存器/匯流排寬度)
↓
ABI 規範 (ILP32 / LP64 / LLP64)
↓
編譯器實作 (Clang / GCC / MSVC)
↓
limits.h 定義 (INT_MIN / INT_MAX)
理解這條鏈路,才能在移植、優化、除錯時游刃有餘。下次看到 int,腦海裡應浮現「暫存器寬度、ABI 契約、指令選擇」——這才是 C 語言工程師的硬核素養。