不同的cpu有不同的位元組序型別,這些位元組序是指整數在記憶體中儲存的順序。
最常見的有兩種:
1. little-endian:將低序位元組儲存在起始位址(低位編址)
2. big-endian:將高序位元組儲存在起始位址(高位編址)
le(little-endian):
最符合人的思維的位元組序
位址低位儲存值的低位
位址高位儲存值的高位
怎麼講是最符合人的思維的位元組序,是因為從人的第一觀感來說
低位值小,就應該放在記憶體位址小的地方,也即記憶體位址低位
反之,高位值就應該放在記憶體位址大的地方,也即記憶體位址高位
be(big-endian):
最直觀的位元組序
位址低位儲存值的高位
位址高位儲存值的低位
為什麼說直觀,不要考慮對應關係
只需要把記憶體位址從左到右按照由低到高的順序寫出
把值按照通常的高位到低位的順序寫出
兩者對照,乙個位元組乙個位元組的填充進去
例子1:在記憶體中雙字0x01020304(dword)的儲存方式。
記憶體位址 4000 4001 4002 4003
le
04 03 02 01
be
01 02 03 04
注:每個位址存1個位元組,每個字有4個位元組。2位16進製制數是1個位元組(0xff=11111111)。
例子2:如果我們將0x1234abcd寫入到以0x0000開始的記憶體中,則結果為
big-endian little-endian
0x0000 0x12
0xcd
0x0001 0x23
0xab
0x0002 0xab
0x34
0x0003 0xcd
0x12
x86系列的cpu都是little-endian的位元組序。
big-endian和little-endian優缺點
big-endian優點:靠首先提取高位位元組,你總是可以由看看在偏移位置為0的位元組來確定這個數字是正數還是負數。你不必知道這個數值有多長,或者你也不必過一些位元組來看這個數值是否含有符號位。這個數值是以它們被列印出來的順序存放的,所以從二進位製到十進位制的函式特別有效。因而,對於不同要求的機器,在設計訪問方式時就會不同。[1]
little-endian優點:提取乙個,兩個,四個或者更長位元組資料的彙編指令以與其他所有格式相同的方式進行:首先在偏移位址為0的地方提取最低位的位元組,因為位址偏移和位元組數是一對一的關係,多重精度的數學函式就相對地容易寫了。[1]
如果你增加數字的值,你可能在左邊增加數字(高位非指數函式需要更多的數字)。因此,經常需要增加兩位數字並移動儲存器裡所有big-endian順序的數字,把所有數向右移,這會增加計算機的工作量。不過,使用little- endian的儲存器中不重要的位元組可以存在它原來的位置,新的數可以存在它的右邊的高位位址裡。這就意味著計算機中的某些計算可以變得更加簡單和快速。[
參考:
大端格式和小端格式
嵌入式系統開發者應該對little endian和big endian模式非常了解。little endian 主機位元組區,高高低低原則 big endian 網路位元組區,高低高低原則 例如,16bit寬的數0x1234在little endian模式cpu記憶體中的存放方式 假設從位址0x40...
大端格式和小端格式
大端格式 小端格式 請寫乙個c函式,若處理器是big endian的,則返回0 若是little endian的,則返回1 解答 int checkcpu c c.a 1 return c.b 1 剖析 嵌入式系統開發者應該對little endian和big endian模式非常了解。例如,16b...
大端格式與小端格式
所謂的大端模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中。為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組...