大端(高位在低地址)--小端(低位在低地址)

一、概念及詳解

  在各種體系的計算機中通常採用的字節存儲機制主要有兩種: big-endian和little-endian,即大端模式和小端模式。

  先回顧兩個關鍵詞,MSB和LSB:

  MSB:MoST Significant Bit ------- 最高有效位
        LSB:Least Significant Bit ------- 最低有效位

  大端模式(big-edian)

  big-endian:MSB存放在最低端的地址上。

  舉例,雙字節數0x1234以big-endian的方式存在起始地址0x00002000中:

| data |<-- address
        | 0x12 |<-- 0x00002000
        | 0x34 |<-- 0x00002001

  在Big-Endian中,對於bit序列中的序號編排方式如下(以雙字節數0x8B8A爲例):

bit | 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15
        ------MSB----------------------------------LSB
        val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
        +--------------------------------------------+
        = 0x8 B 8 A

  小端模式(little-endian)

  little-endian:LSB存放在最低端的地址上。

  舉例,雙字節數0x1234以little-endian的方式存在起始地址0x00002000中:

| data |<-- address
        | 0x34 |<-- 0x00002000
        | 0x12 |<-- 0x00002001

  在Little-Endian中,對於bit序列中的序號編排和Big-Endian剛好相反,其方式如下(以雙字節數0x8B8A爲例):

bit | 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0
        ------MSB-----------------------------------LSB
        val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
        +---------------------------------------------+
        = 0x8 B 8 A

  二、數組在大端小端情況下的存儲:

  以unsigned int value = 0x12345678爲例,分別看看在兩種字節序下其存儲情況,我們可以用unsigned char buf[4]來表示value:
  Big-Endian: 低地址存放高位,如下:

高地址
        ---------------
        buf[3] (0x78) -- 低位
        buf[2] (0x56)
        buf[1] (0x34)
        buf[0] (0x12) -- 高位
        ---------------
        低地址

Little-Endian: 低地址存放低位,如下:

高地址
        ---------------
        buf[3] (0x12) -- 高位
        buf[2] (0x34)
        buf[1] (0x56)
        buf[0] (0x78) -- 低位
        --------------
        低地址

  三、大端小端轉換方法:

  Big-Endian轉換成Little-Endian如下:

#define BigtoLittle16(A)                 ((((uint16)(A) & 0xff00) >> 8) | \
                                                                   (((uint16)(A) & 0x00ff) << 8))
        #define BigtoLittle32(A)                 ((((uint32)(A) & 0xff000000) >> 24) | \
                                                                   (((uint32)(A) & 0x00ff0000) >> 8) | \
                                                                   (((uint32)(A) & 0x0000ff00) << 8) | \
                                                                   (((uint32)(A) & 0x000000ff) << 24))

  四、大端小端檢測方法:

  如何檢查處理器是big-endian還是little-endian?

  聯合體uniON的存放順序是所有成員都從低地址開始存放,利用該特性就可以輕鬆地獲得了CPU內存採用Little-endian還是Big-endian模式讀寫。

int IsBigendian()
        {
                union
                {
                        unsigned int a;//可以理解爲低位字節
                        unsigned char b; //可以理解爲高位字節
                }c;
                c.a = 1;
                return (c.b); 
        } 
        /*return 1: little-endian, return 0:big-endian*/


發佈了20 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章