計算機 Little-Endian 和 Big-Endian (大小字節序、大小端)

一、概念

endian:字節存儲順序,端模式。

Little-Endian 和 Big-Endian表示的是計算機字節順序,所謂的字節順序指的是長度跨越多個字節的數據的存放形式(若只有一個字節則不需考慮字節序的問題)對於整型、長整型等數據類型,Big endian 認爲第一個字節是最高位字節(按照從低地址到高地址的順序存放數據的高位字節到低位字節);而Little endian 則相反,它認爲第一個字節是最低位字節(按照從低地址到高地址的順序存放數據的低位字節到高位字節)。

大部分人在實際的開發中都很少會直接和字節序打交道。唯有在跨平臺以及網絡程序中字節序纔是一個應該被考慮的問題。TCP/IP各層協議將字節序定義爲Big-Endian,因此TCP/IP協議中使用的字節序通常稱之爲網絡字節序。

二、舉例

例如,假設從內存地址0x0000 開始有以下數據:0x12 0x34 0xab 0xcd。
如果我們去讀取一個地址爲0x0000的四個字節變量,若字節序爲big-endian,則讀出結果爲0x1234abcd;若字節序位little-endian,則讀出結果爲 0xcdab3412。

如果我們將0x1234abcd 寫入到以0x0000 開始的內存中,則Little endian 和Big endian 模式的存放結果如下:
地址               0x0000 0x0001 0x0002 0x0003
big-endian        0x12   0x34     0xab     0xcd
little-endian      0xcd   0xab     0x34     0x12
採用Little-Endian的 操作系統: FreeBSD,Linux,Windows x86的機器 ;

採Big-Endian的操作系統:MAC OS, ARM, Alpha,摩托羅拉的PowerPC, Network中的變量 ,Java語言.

三、判斷大小端的方法

實例如下:環境爲32位機

int i=1;

Big-endian方式下:   0x00            0x00             0x00             0x01

Little-endian方式下:0x01            0x00             0x00             0x00

地址:                      1000            1001            1002             1003

獲取i的地址,爲1000處   &i  

強制轉換指針類型爲char * ,即從地址起點截斷1個字節       (char*)&i

此時

Big-endian方式下爲:0x00

Little-endian方式下爲:0x01

得出如下結論

int i=1;

若*(char*)&i等於1 則爲Little-endian方式,否則爲Big-endian方式。

我在自己筆記本上得出的結果是'\x1',應該是16進制的1吧。


發佈了31 篇原創文章 · 獲贊 31 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章