計算機中的大端和小端三

 轉自:http://blog.chinaunix.net/u/29331/showart_356837.html

 

big-endian和little-endian這兩個術語來自Jonathan Swift在十八世紀的嘲諷作品Gulliver’s Travels。 Blefuscu帝國的國民被根據吃雞蛋的方式劃分爲兩個部分:一部分在吃雞蛋的時候從雞蛋的大端(big end)開始,而另一部分則從雞蛋的小端(little end)開始。

x86的CPU使用的是LE(Windows中稱爲“主機字節序”),而SocksAddr中使用的則是BE(就是“網絡字節序”),所以在使用網絡編程時需要使用htns,htnl,nths,nthl來倒字節序。

其實對彙編熟了就清楚了,慘,我的彙編很慘的

LE little-endian
最符合人的思維的字節序
地址低位存儲值的低位
地址高位存儲值的高位
怎麼講是最符合人的思維的字節序,是因爲從人的第一觀感來說
低位值小,就應該放在內存地址小的地方,也即內存地址低位
反之,高位值就應該放在內存地址大的地方,也即內存地址高位

BE big-endian
最直觀的字節序
地址低位存儲值的高位
地址高位存儲值的低位
爲什麼說直觀,不要考慮對應關係
只需要把內存地址從左到右按照由低到高的順序寫出
把值按照通常的高位到低位的順序寫出
兩者對照,一個字節一個字節的填充進去


例子:在內存中雙字0x01020304(DWORD)的存儲方式

內存地址
4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04

MSDN中關於LE和BE的解釋
Byte Ordering Byte ordering Meaning
big-endian The most significant byte is on the left end of a word.
little-endian The most significant byte is on the right end of a word.
這裏這個最重要的字節可以解釋成值的最高位,如果換成是錢的話就是最值錢的那一位
比如我有1234元人民幣,最值錢的是1000元,最不值錢的是4元,那麼這個1就是最重要的字節

Big endian machine: It thinks the first byte it reads is the biggest.
Little endian machine: It thinks the first byte it reads is the littlest.
舉個例子,從內存地址0x0000開始有以下數據
0x0000    0x12
0x0001    0x34
0x0002    0xab
0x0003    0xcd
如果我們去讀取一個地址爲0x0000的四個字節變量,若字節序爲big-endian,則讀出
結果爲0x1234abcd;若字節序位little-endian,則讀出結果爲0xcdab3412.
如果我們將0x1234abcd寫入到以0x0000開始的內存中,則結果爲
                big-endian    little-endian
0x0000    0x12              0xcd
0x0001    0x23              0xab
0x0002    0xab              0x34
0x0003    0xcd              0x12
x86系列CPU都是little-endian的字節序.

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