多字節數據在內存中的存儲順序:
大端:高位字節存低地址(符合人類閱讀習慣),如0x0102存為[01][02]。
小端:低位字節存低地址(x86架構通用),如0x0102存為[02][01]。
網絡傳輸標準為大端(網絡字節序),主機字節序視CPU架構而定。
#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轉換主機序與網絡序。
#include
std::endian::native == std::endian::little // 編譯期常量判斷