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

C語言判斷CPU大小端模式:三種經典方法與原理圖解

     編輯:關於C

大端/小端模式決定多字節數據在內存中的存放順序,跨平台通訊、文件解析、網絡編程中頻繁遇到。本文講解概念、提供三種 C 語言檢測方法並分析原理。

概念速記

模式低地址存放高地址存放助記
大端 (Big-Endian)高位字節低位字節「大」在前 (高位在低地址)
小端 (Little-Endian)低位字節高位字節「小」在前 (低位在低地址)

例:`0x12345678` 在小端機 (x86) 內存順序為 `78 56 34 12`。

方法一:指針訪問首字節 (最直觀)

#include <stdio.h>
int main() {
    short s = 0x1234;
    char *p = (char *)&s;
    printf("%p %02X %02X\n", &s, p[0], p[1]);
    // 小端輸出: 34 12  (低位 0x34 在低地址)
    // 大端輸出: 12 34
    return 0;
}

直接觀察內存佈局,調試時最常用。

方法二:聯合體 (union) — 經典面試題

bool isLittleEndian() {
    union {
        int i;
        char c;
    } u;
    u.i = 1;
    return u.c == 1;  // 小端: 低地址存低位 0x01 → c==1
}

聯合體成員共享起始地址,`int` 低位字節即 `char` 所見內容。

方法三:強制類型轉換 — union 變體

bool isLittleEndian() {
    int val = 0x12345678;
    short *p = (short *)&val;
    return p[0] != 0x1234;  // 小端: 低地址存 0x5678 ≠ 0x1234
}

同理利用地址別名特性,無需定義 union 類型。

工程應用建議

  • 網絡傳輸:統一用大端 (Network Byte Order),調用 `htonl`/`htons`/`ntohl`/`ntohs` 轉換。
  • 文件格式:PNG、JPEG、BMP 等規定大端;Windows BMP 為小端 —— 讀寫時必須查規格。
  • 跨平台序列化:Protocol Buffers、MessagePack 等自動處理端序,優先用成熟庫。
  • 編譯期檢測:GCC/Clang 提供 `__BYTE_ORDER__`、`__ORDER_LITTLE_ENDIAN__` 宏,可 `#if` 靜態分支。

擴展:中端 (Mixed-Endian)

極少數架構 (如 ARM 某模式) 32 位詞內小端,詞間大端。遇到時需逐字節解析,避免直接強轉。

掌握三種檢測法,面試、調試、跨平台開發全覆蓋!

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