-
Endian
鎖定
- 中文名
- Endian
- 在各種
- 計算機體系結構中
- 應 該
- 以什麼樣的順序進行傳送
Endian定義
在各種體系的計算機中,通常採用big-endian和little-endian兩種字節存儲機制描述在多字節數中各個字節的存儲順序。
[1]
Endian詞源
據Jargon File記載,endian這個詞來源於Jonathan Swift在1726年寫的諷刺小説 "Gulliver's Travels"(《格利佛遊記》)。該小説在描述Gulliver暢遊小人國時碰到了如下的一個場景。在小人國裏的小人因為非常小(身高6英寸)所以總是碰到一些意想不到的問題。有一次因為對水煮蛋該從大的一端(Big-End)剝開還是小的一端(Little-End)剝開的爭論而引發了一場戰爭,並形成了兩支截然對立的隊伍:支持從大的一端剝開的人Swift就稱作Big-Endians,而支持從小的一端剝開的人就稱作Little-Endians......(後綴ian表明的就是支持某種觀點的人)。
1980年,Danny Cohen在其著名的論文"On Holy Wars and a Plea for Peace"中為了平息一場關於在消息中字節該以什麼樣的順序進行傳送的爭論而引用了該詞。該文中,Cohen非常形象貼切地把支持從一個消息序列的最高位開始傳送的那夥人叫做Big-Endians,支持從最低位開始傳送的相對應地叫做Little-Endians。此後Endian這個詞便隨着這篇論文而被廣為採用。
Endian小端和大端格式
小端和大端格式(Little-Endian&Big-Endian)
不同的CPU有不同的字節序類型,這些字節序是指整數在內存中保存的順序。
最常見的有兩種:
1. Little-endian:將低序字節存儲在起始地址(低位編址)
2. Big-endian:將高序字節存儲在起始地址(高位編址)
LE(little-endian):
最符合人的思維的字節序:地址低位存儲值的低位,地址高位存儲值的高位。
怎麼講是最符合人的思維的字節序,是因為從人的第一觀感來説:低位值小,就應該放在內存地址小的地方,也即內存地址低位;反之,高位值就應該放在內存地址大的地方,也即內存地址高位
BE(big-endian):
最直觀的字節序:地址低位存儲值的高位,地址高位存儲值的低位。
為什麼説直觀,不要考慮對應關係:只需要把內存地址從左到右按照由低到高的順序寫出,把值按照通常的高位到低位的順序寫出;兩者對照,一個字節一個字節的填充進去
例子1:在內存中雙字0x01020304(DWORD)的存儲方式。
內存地址4000 4001 4002 4003
LE04030201
BE01020304
注:每個地址存1個字節,每個字有2個字節。2位16進制數是1個字節(0xFF=11111111)。
例子2:如果我們將0x1234abcd寫入到以0x0000開始的內存中,則結果為
內存 | big-endian | little-endian |
0x0000 | 0x12 | 0xcd |
0x0001 | 0x34 | 0xab |
0x0002 | 0xab | 0x34 |
0x0003 | 0xcd | 0x12 |
x86系列的CPU都是little-endian的字節序。
Endian開發中的應用
byte[] bytes={0,0,0,25}; //Ifthesystemarchitectureislittle-endian(thatis,littleendfirst), //reversethebytearray. if(BitConverter.IsLittleEndian) Array.Reverse(bytes); inti=BitConverter.ToInt32(bytes,0); Console.WriteLine("int:{0}",i); //Output:int:25
在此示例中,調用 BitConverter 類的 GetBytes(Int32) 方法以將 int 轉換為字節數組。
- 參考資料
-
- 1. Endian的由來
- 詞條統計
-
- 瀏覽次數:次
- 編輯次數:25次歷史版本
- 最近更新: 马铃薯99potato