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

Union 巧判大小端:經典面試題的極簡實現與原理深度剖析

     編輯:關於C

判斷處理器大小端模式是嵌入式、系統程式設計的必考經典。利用 union 同一記憶體空間特性,可用零分支、零函數調用、極少指令完成檢測:

int checkCPU(void) {
    union {
        int a;
        char b;
    } c;
    c.a = 1;
    return (c.b == 1);  // 1 = Little-endian, 0 = Big-endian
}

核心原理:Union 成員共享起始位址

union 所有成員從相同低位址開始存放,佔用空間為最大成員大小。將 int a = 1(0x00000001)寫入後:

模式記憶體佈局 (假設起始 0x4000)c.b 讀取值 (第 0 位元組)返回值
Little-endian 0x4000: 0x01
0x4001: 0x00
0x4002: 0x00
0x4003: 0x00
0x01 1 (True)
Big-endian 0x4000: 0x00
0x4001: 0x00
0x4002: 0x00
0x4003: 0x01
0x00 0 (False)

為何這比位元運算/移位更優?

  • 零運算指令:無需位移、遮罩、邏輯判斷,僅需 MOV + CMP。
  • 無分支預測失敗:返回值直接源自旗標暫存器,極適合管線化 CPU。
  • 語言層面保證:C 標準規定 union 成員共享位址,可移植性極強(除極少數異構架構)。

擴展:檢測 16/64 位元與浮點數大小端

// 16-bit
union { short s; char c; } u16; u16.s = 0x0001;  bool le16 = u16.c == 1;

// 64-bit
union { long long ll; char c; } u64; u64.ll = 0x0000000000000001LL; bool le64 = u64.c == 1;

// 雙精度浮點 (IEEE 754)
union { double d; char c[8]; } uf; uf.d = 1.0;  // 檢查 c[0]..c[7] 佈局

工程落地建議

  1. 編譯期常數化:配合 constexpr (C++11) 或宏,在編譯期確定大小端,消除運行開銷。
  2. 封裝為工具函數:
    #define IS_LITTLE_ENDIAN() ({ union { int i; char c; } u = {1}; u.c; })
  3. 網路序轉換:檢測後統一使用 htons/ntohs 等標準函數,勿手寫位移邏輯。

總結

Union 大小端檢測是硬體特性映射到語言特性的教科書級範例:以最小代價獲取關鍵架構資訊。面試時能寫出此解法並闡述記憶體佈局、union 語義、指令級優勢,即可展現扎實的系統底層功力。

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