big_endian和little_endian的說明(轉載)

bigstone81發表於2008-05-23
big_endian 、little_endian 用於自動改變二進位制位存放順序
Big Endian and 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

低地址 高地址
-----------------------------------------&gt
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian

低地址 高地址
-----------------------------------------&gt
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

從上面兩圖可以看出,採用big endian方式儲存資料是符合我們人類的思維習慣的。而little 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中提供了下面四個轉換位元組序的宏。
[@more@]

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

相關文章