首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

32位與64位編程本質差異:從寄存器寬度到指針模型

     編輯:程式設計疑難解答

核心差異一覽

維度32位編程64位編程
通用寄存器寬度32位 (EAX, EBX...)64位 (RAX, RBX...)
虛擬地址空間4 GB (2^32)理論 16 EB (2^64),實際 48-52位
指針大小4 字節8 字節
size_t/ptrdiff_t4 字節8 字節
長整型Windows: 4B, Linux: 4BWindows: 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位編程深度解析

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved