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

利用 C 語言 Union 聯合體檢測系統大小端模式

     編輯:關於C語言

核心原理:Union 成員共享內存

union 允許不同類型成員佔用同一塊內存區域,大小等於最大成員尺寸。讀取較小成員時,實際讀取的是大成員內存的低地址部分——這恰好映射到字節序的差異。

內存佈局對比:int i = 1 在 Union 中的分布

union Check { int i; char c; } cc;
cc.i = 1; // 0x00000001
模式低地址 → 高地址cc.c 讀取值
Little Endian01 00 00 001 (低位在前)
Big Endian00 00 00 010 (高位在前)

標準檢測代碼

#include 

int checkSys() {
    union {
        int i;
        char c;
    } cc;
    cc.i = 1;
    return (cc.c == 1); // 1 = Little, 0 = Big
}

int main() {
    if (checkSys())
        printf("當前系統為小端模式\n");
    else
        printf("當前系統為大端模式\n");
    return 0;
}

進階:無 Union 版本(指釖強轉)

int checkSys() {
    int i = 1;
    return (*(char*)&i == 1);
}

本質相同:通過 char* 讀取 int 起始字節。

工程應用場景

  • 網絡編程:htonl/ntohl 轉換前需知宿主機序
  • 文件格式解析:BMP/PE/ELF 等規定大端/小端存儲
  • 嵌入式跨平台移植:ARM 可配置大小端,啟動時必須檢測
  • 序列化庫:Protobuf/FlatBuffers 等按小端編碼

補充:位域與大小端

位域分配順序(從低位到高位 vs 高位到低位)同樣受大小端影響,跨平台位域解析需謹慎。

本文轉載自 “明” 博客,原文地址:https://8010089.blog.51cto.com/8000089/1304437

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