[轉]淺談字節序(Byte Order)

原文地址:http://www.cnblogs.com/JeffreyZhao/archive/2010/02/10/1667341.html

 

說到程序間的通信,說到底便是發送數據流。我們一般把字節(byte)看作是數據的最小單位。當然,其實一個字節中還包含8個比特(bit)──有 時候我奇怪爲什麼很多朋友會不知道bit或是它和byte的關係。當我們拿到一系列byte的時候,它本身其實是沒有意義的,有意義的只是“識別字節的方 式”。例如,同樣4個字節的數據,我們可以把它看作是1個32位整數、2個Unicode、 或者字符4個ASCII字符。

同 樣我們知道,在一個32位的CPU中“字長”爲32個bit,也就是4個byte。在這樣的CPU中,總是以4字節對齊的方式來讀取或寫入內存,那麼同樣 這4個字節的數據是以什麼順序保存在內存中的呢?例如,現在我們要向內存地址爲a的地方寫入數據0x0A0B0C0D,那麼這4個字節分別落在哪個地址的 內存上呢?這就涉及到字節序的問題了。

每個數據都有所謂的“有效位(significant byte)”,它的意思是“表示這個數據所用的字節”。例如一個32位整數,它的有效位就是4個字節。而對於0x0A0B0C0D來說,它的有效位從高到 低便是0A、0B、0C及0D——這裏您可以把它作爲一個256進制的數來看(相對於我們平時所用的10進制數)。

而所謂大字節序(big endian) ,便是指其“最高有效位(most significant byte) ”落在低地址上的存儲方式。例如像地址a寫入0x0A0B0C0D之後,在內存中的數據便是:

 



 而對於小字節序(little endian) 來說就正好相反了,它把“最低有效位(least significant byte) ”放在低地址上。例如:

 


    對於我們常用的CPU架構,如Intel,AMD的CPU使用的都是小字節序,而例如Mac OS以前所使用的Power PC使用的便是大字節序(不過現在Mac OS也使用Intel的CPU了)。此外,除了大字節序和小字節序之外,還有一種很少見的中字節序(middle endian),它會以2143的方式來保存數據(相對於大字節序的1234及小字節序的4321)。

關於字節序的詳細說明,您可以參考Wikipedia裏的Endianness條目

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章