Endianness
我相信很多人或多或少都聽過Endianness,當你發現問題是出現在Endianness時,你會說這是因為Big Endian跟Little Endian的不同。但是你搞得清楚Big Endian跟Littile Endian的定義嗎? 說實在話,我不行,所以趁最近的一次機會,跟同事Benson一起整理出口訣(好像是高中數學補習班的作法)。
Endian = Lower Address
Big = MSB (Most Significant Bit)
Little = LSB (Last Significant Bit)
Big-Endian = MSB on the lower address
Little-Endian = LSB on the lower address
比方說一個U16的值,0x000e,在不同系統裡的表示方法:
Big -Endian:
address 0x00000000: 00
address 0x00000001: 0e
Little -Endian:
address 0x00000000: 0e
address 0x00000001: 00
有錯歡迎大家指正。
7 Comments:
基本上 只要記幾個基本 case 就好啦
x86 是 little endian
MIPS 是 big endian(後期有 bi-endain)
還有 一個中心思想
little endian 是 byte-oriented
所以 低位低放 (LSB 放在 memory address 低的位置)
而 big endian 是 word-oriented
還有 big-endian 最大的好處
memory dump 可用直接照順序來
字串和整數都是人讀的格式
little-endian 就不是了
果然是高手。想再請問一下 "還有 big-endian 最大的好處
memory dump 可用直接照順序來" 是什麼意思呢? 可以再多解釋一點嗎?
假設你有一個 structure 放在 memory 裡
你要 dump 出來看
strct X
{
int i0,
short s0,
short s1,
char[8]
} temp;
temp = {0x11223344, 0x5566, 0x7788, "hello\0"};
big:
0:3 11 22 33 44
4:7 55 66 77 88
8:15 'h' 'e' 'l' 'l' 'o' '\0'
little:
0:3 44 33 22 11
4:7 66 55 88 77
8:15 'h' 'e' 'l' 'l' 'o' '\0'
還有
如果你想要偷懶
用 load 一個 integer = load 兩個 short
猜猜 big and little endian 會有什麼問題
吼~~好熟悉啊~~~
我不當工程師已經很久了~~~
討厭 intel 格式(也就是 little-endian 啦)~~
那個 Windows 用的 FAT 也都是 little-endian,討厭死了~~ XD
口絕!哈哈!化學好像就有很多口訣。
有個觀念澄清一下。
Endian是Byte-Ordering,不是Bit-Ordering。
不要把LSB、MSB抓進來混為一談喔~~
至於為啥叫Big/Little Endian?那又是個有趣的故事了。
可以參考這裡的最後一段。
http://libai.math.ncu.edu.tw/bcc16/pool/1.33.shtml
Hi, Jeff,
Little endian -- little end first
Big endian -- Big end first
A picture is worth a thousand words:
0x12345678
big ---> little
end end
Suppose memory is arranged from low to high, then:
Little endian system:
low addr Little end first
| 78
| 56
| 34
V 12
high addr
Big endian system:
low addr Big end first
| 12
| 34
| 56
V 78
high addr
>=)
Cheers,
jethro
--
[host][~jethro/]> fortune
Lubarsky's Law of Cybernetic Entomology:
There's always one more bug.
/*
big:
0:3 11 22 33 44
4:7 55 66 77 88
8:15 'h' 'e' 'l' 'l' 'o' '\0'
little:
0:3 44 33 22 11
4:7 66 55 88 77
8:15 'h' 'e' 'l' 'l' 'o' '\0'
*/
不是这样的,软硬通吃的工程师是这么认为的
3:0
7:4
因为那是32bit的data bus就是这样的。
就连VHDL里也一般这么表达
DataBus : INOUT STD_LOGIC_VECTOR(31 downto 0);
总之,要有downto的概念就是了。谁让我们搞这行当,别人心算是十进制的,我们是二进制的。别人是从小数到大,我们是从大数到小。
残念。难怪我自己都觉得自己是怪物。
Post a Comment
<< Home