big and little endian

概括:

big endian: 高byte低地址。0x123456 12 34 56 (低地址--高地址)

little endian:低byte 低地址。 0x123456 56 34 12 (低地址--高地址)

 

談到字節排序的問題,必然牽涉到兩大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列
CPU。PowerPC系列採用big endian方式存儲數據,而x86系列則採用little
endian方式存儲數據。ARM同時支持 big和little,實際應用中通常使用little
endian。那麼究竟什麼是big endian,什麼又是little endian呢?

其實big endian是指低地址存放最高有效字節(MSB),而little
endian則是低地址存放最低有效字節(LSB)。用文字說明可能比較抽象,下面用圖像加以說明。比如數字0x12345678在兩種不同字節序CPU中的存儲順序如下所示:

Big Endian
一個Word中的高位的Byte放在內存中這個Word區域的低地址處

低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian
一個Word中的低位的Byte放在內存中這個Word區域的低地址處

低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

從上面兩圖可以看出,採用big
endian方式存儲數據是符合我們人類的思維習慣的。必須注意的是:一個Word的長度是16位,一個Byte的長度是8位。如果一個數超過一個
Word的長度,必須先按Word分成若干部分,然後每一部分(即每個Word內部)按Big-Endian或者Little-Endian的不同操作來
處理字節。
一個例子:
如果我們將0x1234abcd寫入到以0x0000開始的內存中,則結果爲
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x34 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12

需要特別說明的是,以上假設機器是每個內存單元以8位即一個字節爲單位的.簡單的說,little
endian把低位存放到高位,而big endian把低位存放到低位.
現在主流的CPU,intel系列的是採用的little
endian的格式存放數據,而motorola系列的CPU採用的是big endian.
以下是判斷字節存儲順序的可移植的C語言代碼:
/*可移植的用於判斷存儲格式是
little endian還是big ednian的C代碼*/
#include < stdio.h >
union
{
long Long;
char Char[ sizeof ( long )];
} u;

int main()
{
u.Long = 1 ;
if (u.Char[ 0 ] == 1 )
{
printf( " Little Endian!\n " );
}
else if (u.Char[ sizeof ( long ) - 1 ] == 1 )
{
printf( " Big Endian!\n " );
}
else
{
printf( " Unknown Addressing!\n " );
}

printf( " Now, Let's look at every byte in the memory!\n " );
for ( int i = 0 ; i < sizeof ( long ); ++ i)
{
printf( " [%x] = %x\n " , & u.Char[i], u.Char[i]);
}
return 0 ;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章