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

C語言定義 32 位有符號整數的跨平台最佳實踐:stdint.h 固定寬度類型

     編輯:C 語言問答

核心問題

int 標準僅保證 ≥ 16 位,**位寬隨平台/編譯器變化** (16/32/64 位均合法)。直接用 int 無法保證 32 位。

現代標準解決方案 (C99 <stdint.h>)


#include <stdint.h>
#include <stdio.h>

int main() {
    int32_t a = 2147483647;   // 精確 32 位有符號
    uint32_t b = 4294967295u; // 精確 32 位無符號
    int_least32_t c = 100;    // 至少 32 位 (通常同 int32_t)
    int_fast32_t d = 200;     // 最快 32 位 (某平台可能 64 位)

    printf("int32_t: %d (0x%X)\n", a, a);
    printf("sizeof(int32_t) = %zu\n", sizeof(int32_t));  // 必為 4
    return 0;
}

類型對照表

類型含義典型大小格式化宏 (C99)
int32_t精確 32 位有符號4 bytesPRId32, PRIx32
uint32_t精確 32 位無符號4 bytesPRIu32, PRIx32
int_least32_t≥32 位最小類型≥4 bytesPRIdLEAST32
int_fast32_t≥32 位最快類型≥4 bytesPRIdFAST32
intptr_t能存指標的有符號整數平台相關PRIdPTR

舊編譯器兼容方案 (無 stdint.h)


// 手動定義 (確認平台後)
#if defined(_MSC_VER) && _MSC_VER < 1600  // VS2010 前
typedef signed __int32 int32_t;
typedef unsigned __int32 uint32_t;
#else
// 現代編譯器均內建 stdint.h
#include 
#endif

格式化輸出最佳實踐


int32_t x = -12345678;
printf("x = %" PRId32 "\n", x);      // 跨平台安全
// 或強制轉型 (僅知 32 位時)
printf("x = %ld\n", (long)x);        // long 至少 32 位

結論

  • **永遠使用 int32_t/uint32_t** 表達「精確 32 位」語意。
  • **避免** long (Windows 64 位為 4 字節、Linux 64 位為 8 字節)。
  • **結構體網路/檔案序列化** 必須用固定寬度類型 + 字節序轉換 (htonl/ntohl)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved