Big Endian 和 Little Endian 模式的區別

談到字節序的問題,必然牽涉到兩大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列採用big endian方式存儲數據,而x86系列則採用little endian方式存儲數據。那麼究竟什麼是big endian,什麼又是little endian呢?網絡

其實big endian是指低地址存放最高有效字節(MSB),而little endian則是低地址存放最低有效字節(LSB)。函數

    用文字說明可能比較抽象,下面用圖像加以說明。好比數字0x12345678在兩種不一樣字節序CPU中的存儲順序以下所示:翻譯

Big Endian指針

   低地址                                            高地址內存

 ----------------------------------------------------------------------------->開發

   |     12     |      34    |     56      |     78    |it

Little Endian io

   低地址                                            高地址編譯

   ----------------------------------------------------------------------------->nio

   |     78     |      56    |     34      |     12    |

     從上面兩圖能夠看出,採用big endian方式存儲數據是符合咱們人類的思惟習慣的。

     爲何要注意字節序的問題呢?你可能這麼問。固然,若是你寫的程序只在單機環境下面運行,而且不和別人的程序打交道,那麼你徹底能夠忽略字節序的存在。可是,若是你的程序要跟別人的程序產生交互呢?尤爲是當你把你在微機上運算的結果運用到計算機羣上去的話。

 

在這裏我想說說兩種語言。C/C++語言編寫的程序裏數據存儲順序是跟編譯平臺所在的CPU相關的,而JAVA編寫的程序則惟一採用big endian方式來存儲數據。試想,若是你用C/C++語言在x86平臺下編寫的程序跟別人的JAVA程序互通時會產生什麼結果?就拿上面的0x12345678來講,你的程序傳遞給別人的一個數據,將指向0x12345678的指針傳給了JAVA程序,因爲JAVA採起big endian方式存儲數據,很天然的它會將你的數據翻譯爲0x78563412。所以,在你的C程序傳給JAVA程序以前有必要進行字節序的轉換工做。

 

全部網絡協議也都是採用big endian的方式來傳輸數據的。因此有時咱們也會把big endian方式稱之爲網絡字節序。當兩臺採用不一樣字節序的主機通訊時,在發送數據以前都必須通過字節序的轉換成爲網絡字節序後再進行傳輸。ANSI C中提供了下面四個轉換字節序的宏。


一道C語言的試題:請寫一個C函數,若處理器是Big_endian的,則返回0;如果Little_endian的,則返回1。

解答:

int checkCPU()
{
 {
  union w
  {
   int a;
   char b;
  } c;
  c.a = 1;
  return (c.b == 1);
 }
}

嵌入式系統開發者應該對Little-endian和Big-endian模式很是瞭解。採用Little-endian模式的CPU對操做數的存放方式是從低字節到高字節,而Big-endian模式對操做數的存放方式是從高字節到低字節。例如,16bit寬的數0x1234在Little- endian模式CPU內存中的存放方式(假設從地址0x4000開始存放)爲:

內存地址 

存放內容 

0x4000

0x34

0x400 

0x12
  而在Big-endian模式CPU內存中的存放方式則爲:

 

內存地址

存放內容

0x4000

0x12

0x4001

0x34


  32bit寬的數0x12345678在Little-endian模式CPU內存中的存放方式(假設從地址0x4000開始存放)爲: 

內存地址

存放內容

0x4000

0x78

0x4001

0x56

0x4002

0x34

0x4003

0x12


  而在Big-endian模式CPU內存中的存放方式則爲:

內存地址

存放內容

0x4000

0x12

0x4001

0x34

0x4002

0x56

0x4003

0x78


  聯合體union的存放順序是全部成員都從低地址開始存放,解答利用該特性,輕鬆地得到了CPU對內存採用Little-endian仍是Big-endian模式讀寫。


 

X86 系列 CPU都是 little-endian 的, BIG-ENDIAN、LITTLE-ENDIAN跟多字節類型的數據有關,好比int,short,long型。

好比 int a = 0x05060708

在BIG-ENDIAN的狀況下存放爲:

字節號 0 1 2 3

數據 05 06 07 08

在LITTLE-ENDIAN的狀況下存放爲:

字節號 0 1 2 3

數據 08 07 06 05

 

----【轉】

相關文章
相關標籤/搜索