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

內存大小端模式定義與檢測方法詳解

     編輯:關於C語言

基本概念

大端模式:數據的低位字節存放在高地址,高位字節存放在低地址 (類似人類閱讀順序)。
小端模式:數據的低位字節存放在低地址,高位字節存放在高地址 (x86/ARM 默認)。

例:32 位整數 0x01020304 在內存中 (地址遞增) 分佈:

地址大端內容小端內容
基址 +00x01 (高位)0x04 (低位)
基址 +10x020x03
基址 +20x030x02
基址 +30x04 (低位)0x01 (高位)

經典檢測代碼 (利用 Union 重疊特性)

int check_endian(void) {
    union {
        int i;
        char c;
    } u;
    u.i = 1;           // 0x00000001
    return (u.c == 1); // 小端返回 1,大端返回 0
}

原理:union 成員共享同一塊內存。int i = 1 只有最低位字節為 1。若 char c (佔據最低地址字節) 讀到 1,說明低地址存低位 → 小端;若讀到 0,說明低地址存高位 → 大端。

其他檢測方法

1. 指釖強制轉換

int check_endian_ptr(void) {
    int i = 1;
    return *(char *)&i; // 同理
}

2. 編譯器內建宏 (推薦,零開銷)

// GCC/Clang
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
// 小端
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
// 大端
#else
#error "Unknown endianness"
#endif

// MSVC
#if defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM) || defined(_M_ARM64)
// 小端
#endif

3. 運行時庫函數

  • Linux/BSD:#include → __BYTE_ORDER
  • 網絡編程:htonl/ntohl (主機序↔網絡序大端) 隱含檢測

實際開發中的影響場景

  1. 網絡通信:協議規定大端 (Network Byte Order),收發端需 htonl/ntohl、htons/ntohs 轉換。
  2. 文件格式/序列化:BMP、PNG、JPEG、TCP/IP 頭部均為大端;Intel x86 執行文件、Windows BMP 部分字段為小端。跨平台讀寫必須顯式處理字節序。
  3. 共享內存/異構系統:ARM (可配大小端) 與 x86 通信需約定字節序。
  4. 位操作/類型懲罰:通過 char* 訪問 int 內部字節時,結果取決於端序。

編碼建議

  • 網絡/文件解析:永遠显式調用轉換函數,不依賴宿主端序。
  • 跨平台庫:提供 read_u32_le/write_u32_be 等明確端序的 API。
  • 調試時:內存窗口查看原始字節序,結合 union 技巧驗證理解。

總結

大小端是計算機體系結構層面的約定差異。union 檢測法原理清晰、代碼極短,是面試經典;工程實踐中優先使用編譯器內建宏或標準庫常量 實現編譯期分支,消除運行時開銷。記住:網絡序=大端,x86/主流 ARM=小端,收發必轉換。

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