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

C語言聯合體實戰:利用 Union 檢測大小端模式與 ASCII 碼轉換

     編輯:關於C

聯合體所有成員共享同一塊內存,這特性使其成為檢測CPU字節序(大小端模式)與類型轉換的利器。本文通過兩個經典案例深度解析聯合體內存佈局行為。

案例一:檢測系統字節序

int checkSystem() {
    union Check {
        int i;
        char ch;
    } c;
    
    c.i = 1;              // 0x00000001
    return (c.ch == 1);   // 返回 1 表示小端模式
}

原理圈析

小端模式(x86/ARM 主流):低位字節存低地址

內存佈局:地址遞增 →
[01] [00] [00] [00]
 ↑
c.ch 讀取到 0x01 → 返回 1

大端模式(網絡序/部分 RISC):高位字節存低地址

內存佈局:地址遞增 →
[00] [00] [00] [01]
 ↑
c.ch 讀取到 0x00 → 返回 0

大小端內存佈局示意圖

案例二:ASCII 碼與字符互轉

union ASCII {
    char c;
    short i;
} m;

m.i = 70;
cout << "ASCII碼為70的字符為:" << m.c << endl;  // 輸出 'F'

m.c = 'a';
cout << "字符a的ASCII碼是" << m.i << endl;       // 輸出 97

內存視角解析

short 佔 2 字節,char 佔 1 字節,共享低地址字節:

m.i = 70 (0x0046)  →  內存:[46] [00]
m.c 讀取低字節 0x46 → 'F'

m.c = 'a' (0x61)   →  內存:[61] [00]
m.i 讀取 0x0061 → 97

工程應用場景

  • 網絡協議解析:主機序轉網絡序(htonl/ntohl 內部原理)
  • 硬件寄存器操作:位域與整數視圖切換
  • 序列化框架:類型安全的字節流讀寫
  • 协议栈零拷貝:同一內存多種結構體視圖

避坑指南

  1. 訪問非活躍成員屬於未定義行為(C11 允許類型遊覽,但需謹慎)
  2. 對齊要求:聯合體大小取最大成員,對齊按最嚴格成員
  3. 嚴格別名規則:編譯器可能優化導致預期外行為,必要時用 memcpy 或 union 類型遊覽
  4. 跨平台代碼不可假設字節序,務必運行時檢測或使用標準轉換函數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved