首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C 標準類型長度對照表:跨平台、跨編譯器的 sizeof 實測數據

     編輯:關於C++

C/C++ 標準僅規定類型的 最小範圍,實際 sizeof 隨平台(ILP32/LP64/LLP64)、編譯器、架構而異。本文匯總 Windows/Linux/Solaris 主流環境的實測數據,並提供自動生成對照表的程式碼,助你寫出可移植的序列化、網路協議、嵌入式代碼。

實測數據總表(位元組)

類型Win2K VCWin2K Dev-C++ / Ubuntu GCCSun Ultra10 Solaris GCC (32-bit)
char111
int444
long int444
float444
double888
long double81216
double*444
char*444

關鍵觀察

  • long double 差異最大:VC 8 字節(同 double)、GCC x86 12 字節(80-bit 延伸精度 + 對齊)、SPARC 16 字節(128-bit quadruple precision)。科學計算慎用 VC,跨平台傳輸禁用 long double。
  • 32 位環境下所有指標均為 4 字節;64 位 LP64 下 long/指標 8 字節,LLP64 (Windows x64) 下 long 仍為 4 字節。
  • int、long 在 32 位系統通常同寬,但不可假設永遠相等。

自動生成對照表程式碼

#include <stdio.h>
int main() {
    char c; int i; long int j; float k; double l; long double m;
    char *cp; double *lp;
    #define P(t, v) printf("[%s] Size Total:%zu\n", #t, sizeof(v))
    P(char, c); P(int, i); P(long int, j); P(float, k);
    P(double, l); P(long double, m);
    P(double point, cp); P(char point, lp);
    return 0;
}

編譯執行即可獲得當前環境精確數據。建議專案 CMake 中加入 check_type_size() 自動記錄。

可移植編程建議

  1. 使用 <cstdint> 固定寬度類型:int32_t, uint64_t, intptr_t。
  2. 序列化/網路協議禁用原生類型,統一用定長類型 + 明確位序(大端/小端)。
  3. long double 僅用於本地高精度中間運算,落地存儲/傳輸轉為 double 或十進制字串。
  4. 結構體對齊用 #pragma pack 或 alignas 顯式控制,配合 static_assert(sizeof(T) == N) 編譯期斷言。

把這張表存進團隊 Wiki,下次跨平台移植或定義協議結構時,就能少踩無數「sizeof 假設一致」的坑。

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