[C] 判斷Big-Endian or Little-Endian
Sep 26, 2021
在現今主流的 CPU 中,最常見的位元組順序有兩種,分別是 Big-Endian 與 Little-Endian,Big-Endian 是指資料放進記憶體中的時候,最高位的位元組會放在最低的記憶體位址上,而 Little-Endian 則是剛好相反,它會把最高位的位元組放在最高的記憶體位址上。
我們直接以一個簡單的範例來說明 Big-Endian 與 Little-Endian 的差異會更清楚,假設我們有一個 32 位元(bits)的整數資料為 0x12345678
,在 Big-Endian 的機器將其放置在記憶體中的時候,會按照下圖中的規則放置:
但是如果換成 Little-Endian 的機器,將 0x12345678
放在記憶體中的方式就會剛好相反,會變成這樣:
C 語言判斷位元組順序
如果我們的程式會使用 union
這類的低階存取方式處理記憶體中的資料,位元組順序就會是非常關鍵的問題,如果不確定自己的機器是屬於那一種位元組順序,可以使用以下這段簡單的程式來判斷:
#include <stdio.h>int main() {
typedef union {
unsigned int i;
unsigned char c[4];
} EndianTest;
EndianTest t;
t.i = 0x12345678;
if(t.c[0] == 0x12 && t.c[1] == 0x34 && t.c[2] == 0x56 && t.c[3] == 0x78){
printf("Big Endian!!");
}else if(t.c[0] == 0x78 && t.c[1] == 0x56 && t.c[2] == 0x34 && t.c[3] == 0x12){
printf("Little Endian!!");
}else{
printf("Other Endian!!");
}
return 0;
}
output (Intel CPU):
Little Endian!!