核心差異一覽
| 維度 | 32位編程 | 64位編程 |
| 通用寄存器寬度 | 32位 (EAX, EBX...) | 64位 (RAX, RBX...) |
| 虛擬地址空間 | 4 GB (2^32) | 理論 16 EB (2^64),實際 48-52位 |
| 指針大小 | 4 字節 | 8 字節 |
| size_t/ptrdiff_t | 4 字節 | 8 字節 |
| 長整型 | Windows: 4B, Linux: 4B | Windows: 4B, Linux: 8B (LP64) |
| 調用約定 | stdcall/cdecl (棧傳參) | x64 calling convention (寄存器傳參 RCX/RDX/R8/R9) |
兩者關係與兼容性
- 64位CPU可運行32位程式: 兼容模式 (WoW64 on Windows, IA32_EMULATION on Linux)
- 32位程式不能直接調用64位DLL/so: 需進程間通信 (IPC、RPC、Socket)
- 數據結構對齊規則不同: 結構體大小、偏移量可能改變,序列化/反序列化需注意
遷移常見坑
// 1. 指針截斷
long ptr = (long)pointer; // 32位下正確,64位截斷高32位
// 正確:uintptr_t / intptr_t
// 2. 格式化字符串
printf("%x", pointer); // 64位應用 %p 或 %lx
// 正確:printf("%p", (void*)pointer);
// 3. 結構體對齊導致大小變化
struct { int a; void* p; }; // 32位: 8B, 64位: 16B (對齊填充)
// 正確:#pragma pack 或 顯式填充
// 4. 數組索引溢出
int arr[SIZE];
for (int i=0; i
學習資源推薦
參考:32位與64位編程深度解析