移植 C/C++ 程式碼至不同架構時,基本型態長度差異是常見坑點。本文對照 ILP32、LP64、LLP64 三種資料模型下的型態位元寬度。


| 型態 | ILP32 (32-bit) | LP64 (64-bit Linux/Unix) | LLP64 (64-bit Windows) |
|---|---|---|---|
| char | 8 | 8 | 8 |
| short | 16 | 16 | 16 |
| int | 32 | 32 | 32 |
| long | 32 | 64 | 32 |
| long long | 64 | 64 | 64 |
| pointer | 32 | 64 | 64 |
int32_t, uint32_t // 確切 32 位
int64_t, uint64_t // 確切 64 位
size_t:與機器字長一致 (ILP32=32, LP64=64)。off_t:32 位系統預設 32 位,無法操作 >4GB 檔案。需定義 _FILE_OFFSET_BITS 64 使其變為 64 位 (off64_t);64 位系統預設 64 位。ino_t:與機器字長一致。理解模型差異,編寫可移植程式碼時優先使用固定寬度型態與大檔案支援宏。