Wednesday, August 09, 2006

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:

At 5:49 PM, Anonymous Anonymous said...

基本上 只要記幾個基本 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 就不是了

 
At 9:22 PM, Blogger Jeff said...

果然是高手。想再請問一下 "還有 big-endian 最大的好處
memory dump 可用直接照順序來" 是什麼意思呢? 可以再多解釋一點嗎?

 
At 3:56 PM, Anonymous Anonymous said...

假設你有一個 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 會有什麼問題

 
At 3:11 AM, Anonymous Anonymous said...

吼~~好熟悉啊~~~
我不當工程師已經很久了~~~
討厭 intel 格式(也就是 little-endian 啦)~~
那個 Windows 用的 FAT 也都是 little-endian,討厭死了~~ XD

 
At 2:01 PM, Anonymous Anonymous said...

口絕!哈哈!化學好像就有很多口訣。

有個觀念澄清一下。
Endian是Byte-Ordering,不是Bit-Ordering。
不要把LSB、MSB抓進來混為一談喔~~

至於為啥叫Big/Little Endian?那又是個有趣的故事了。
可以參考這裡的最後一段。
http://libai.math.ncu.edu.tw/bcc16/pool/1.33.shtml

 
At 4:11 PM, Anonymous Anonymous said...

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.

 
At 12:33 AM, Anonymous Anonymous said...

/*
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