[轉]Big Endian和Little Endian的比較

endian指的是當物理上的最小單元比邏輯上的最小單元小時,邏輯單元對映到物理單元的排布關係。

實際的例子


如果你在文件上看到一個雙字組的data,Ex: long MyData=0x12345678,要寫到從0x0000開始的記憶體位址時。

  1. 如果是Big Endian的系統,
    存到記憶體會變成 0x12 0x34 0x56 0x78,最高位元組在位址最低位元,最低位元組在位址最高位元,依次排列。
  2. 如果是Little Endian的系統,
    存到記憶體會變成 0x78 0x56 0x34 0x12,最低位元組在最低位元,最高位元組在最高位元,反序排列。

比較的結果就是這樣:

big-endianlittle-endian
0x00000x120x78
0x00010x340x56
0x00020x560x34
0x00030x780x12


這有什麼差別呢?


以目前常見的CPU為例:

  • INTEL X86、DEC VAX 使用 LITTLE-ENDIAN 設計;
  • HP、IBM、MOTOROLA 68K 系列使用 BIG-ENDIAN 設計;
  • POWERPC 同時支援兩種格式,稱為 BI-ENDIAN。


另外,以我目前在SID測試的程式testendian.c為例,我必須在以下的三個地方都必須指定Endian,否則即使Build時可以通過,但在計算時就可能會出現問題,因為放入記憶體內的資料可能是反過來的。

  1. 在Compile時
    就必須先指定是要採用那種Endian,如果不指定,會使用內定值;
  2. 在ToolChain內
    也必須指定是要採用那種Endian,如果不指定,也會使用內定值;
  3. 在SID內
    也是由設定來決定Endian,所以在模擬CPU的Configuration內也必須指定是要採用那種Endian。
未經允許不得轉載:GoMCU » [轉]Big Endian和Little Endian的比較