Big-Endian Little-Endian

tthero00boo發表於2013-11-04
 
1. $ lscpu
2. $ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
0 -- On a Big Endian system (Solaris, SPARC)
1 -- On a Little Endian system (Linux, Intel)
3. $ python test_endian

$ cat test_endian
#!/usr/bin/env python
from struct import pack
if pack('@h', 1) == pack('
    print "Little Endian"
else:
    print "Big Endian"

4. $ gcc -o endian c_endian.c

# cat c_endian.c
#include
int main(void)
{
  union w
  {
    int a;
    char b;
  } c;

  c.a=1;
  printf("check: Big Endian 0 ; Little Endian 1 ; result:%d\n",(c.b==1));
  return 0;
}

一般來說,大部分使用者的作業系統(如windows, FreeBsd, Linux)是Little Endian的。
少部分,如MAC OS ,是Big Endian 的。

DEC (Digital Equipment Corporation,現在是Compaq公司的一部分)和Intel的機器(X86平臺)一般採用小端。
IBM, Motorola(Power PC), Sun的機器一般採用大端。
當然,這不代表所有情況。有的CPU即能工作於小端, 又能工作於大端, 比如ARM, Alpha,摩托羅拉的PowerPC。 具體情形參考處理器手冊。
具體這類CPU是大端還是小端,應該和具體設定有關。
(如,Power PC支援little-endian位元組序,但在預設配置時是big-endian位元組序)

不同的CPU上執行不同的作業系統,位元組序也是不同的,參見下表。

處理器             作業系統    位元組排序
Alpha              全部     Little endian
HP-PA              NT      Little endian
HP-PA              UNIX    Big endian
Intelx86           全部     Little endian
Motorola680x()     全部     Big endian
MIPS               NT      Little endian
MIPS               UNIX    Big endian
PowerPC            NT      Little endian
PowerPC            非NT     Big endian 
RS/6000            UNIX    Big endian
SPARC              UNIX    Big endian
IXP1200 ARM核心     全部     Little endian 

大小端的說法源自《格列佛遊記》。我們知道,雞蛋通常一端大一端小,小人國的人們對於剝蛋殼時應從哪一端開始剝起有著不一樣的看法。同樣,計算機界對於傳輸多位元組字(由多個位元組來共同表示一個資料型別)時,是先傳高位位元組(大端)還是先傳低位位元組(小端)也有著不一樣的看法,這就是計算機裡頭大小端模式的由來了。無論是寫檔案還是網路傳輸,實際上都是往流裝置進行寫操作的過程,而且這個寫操作是從流的低地址向高地址開始寫(這很符合人的習慣),對於多位元組字來說,如果先寫入高位位元組,則稱作大端模式。反之則稱作小端模式。也就是說,大端模式下,位元組序和流裝置的地址順序是相反的,而小端模式則是相同的。一般網路協議都採用大端模式進行傳輸。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28859270/viewspace-775664/,如需轉載,請註明出處,否則將追究法律責任。