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

大小端模式對 C 語言聯合體(union)內存佈局的影響實測

     編輯:關於C語言

C 語言 union 所有成員共享同一塊內存,其內存佈局直接受 CPU 大小端模式決定。本文通過經典面試題實測驗證 x86 小端模式下 union {int i; char ch[2];} 的輸出差異,並解析大端模式下的理論結果。

實驗代碼

#include <stdio.h>

union {
    int i;
    char ch[2];
} key;

int main(void) {
    key.i = 65 * 256 + 66;  // 0x4142
    printf("%c %c\n", key.ch[0], key.ch[1]);
    return 0;
}

輸出結果(x86-64, Little-Endian)

B A

深度解析

內存佈局圖解

地址遞增 →低地址高地址
int i (0x4142)0x42 ('B')0x41 ('A')
ch[0] / ch[1]ch[0] = 'B'ch[1] = 'A'
  • 小端模式:低位字節存低地址。0x4142 低字節 0x42 ('B') 落在 ch[0],高字節 0x41 ('A') 落在 ch[1],故輸出 B A。
  • 大端模式:高位字節存低地址。若同樣賦值 0x4142,則 ch[0]='A'、ch[1]='B',輸出 A B。
  • 補充:若 int 佔 4 字節,ch[2] 只覆蓋低 2 字節,高 2 字節保持為 0,大端下前兩字節為 0,輸出將是兩個不可見控制字符(空格/空字符)。

工程實踐啟示

  1. 網絡編程:協議頭通常採用大端(網絡序),需用 htonl/ntohl 轉換,不可直接用 union 別名訪問。
  2. 文件格式解析:BMP、WAV 等小端格式可直接映射 struct/union;JPEG、PNG 等大端格式需字節序轉換。
  3. 跨平台序列化:嚴禁直接傳輸 union/struct 內存映像,必須定義明確序列化協議(Protocol Buffers, FlatBuffers, 手寫 pack/unpack)。
  4. 編譯器屬性:GCC/Clang 支持 __attribute__((scalar_storage_order("big-endian"))) 強制結構體大端佈局(僅限標量字段),慎用。

快速檢測當前平台字節序

#include <stdio.h>
int main(void) {
    union { uint32_t i; char c[4]; } u = {0x01020304};
    printf("本機為 %s 模式\n", (u.c[0] == 0x04) ? "小端" : "大端");
    return 0;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved