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

大小端模式判斷:C語言與匯編實現全解析

     編輯:關於C語言

什麼是大小端?

多字節數據在內存中的存儲順序:
大端:高位字節存低地址(符合人類閱讀習慣),如0x0102存為[01][02]。
小端:低位字節存低地址(x86架構通用),如0x0102存為[02][01]。
網絡傳輸標準為大端(網絡字節序),主機字節序視CPU架構而定。

C語言判斷方案:聯合體法


#include 
union {
    short num;
    char bytes[sizeof(short)];
} un;

int main() {
    un.num = 0x0102;
    if (sizeof(short) == 2) {
        if (un.bytes[0] == 1 && un.bytes[1] == 2)
            printf("big-endian\n");
        else if (un.bytes[0] == 2 && un.bytes[1] == 1)
            printf("little-endian\n");
        else
            printf("unknown\n");
    }
    return 0;
}

原理:short與char[2]共享內存,通過訪問字節數組觀察低地址字節值。

匯編語言判斷方案


include io32.inc
.data
msg1 byte 'big-endian',13,10,0
msg2 byte 'little-endian',13,10,0
num word 1234h
.code
start:
    xor ebx, ebx
    mov bl, byte ptr num     ; 取低地址字節
    cmp bl, 12h              ; 高位字節為0x12?
    je  is_big
    mov eax, offset msg2
    jmp show
is_big:
    mov eax, offset msg1
show:
    call dispmsg
    exit 0
end start

直接讀取內存低地址字節與立即數比較,無需聯合體語法開銷。

工程應用場景

  • 網絡編程:htonl/ntohl、htons/ntohs轉換主機序與網絡序。
  • 文件格式解析:BMP、TCP/IP頭部等規定大端存儲。
  • 跨平台數據交換:序列化協議(Protobuf、MessagePack)需處理字節序。
  • 調試時通過內存窗口快速判斷目標機器字節序。

補充:C++17標準庫支持


#include 
std::endian::native == std::endian::little  // 編譯期常量判斷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved