天天看點

[轉]淺談位元組序(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之後,在記憶體中的資料便是:

[轉]淺談位元組序(Byte Order)

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

[轉]淺談位元組序(Byte Order)

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

關于位元組序的詳細說明,您可以參考Wikipedia裡的Endianness條目 。