大端序和小端序

大端序和小端序

一、概述

字節序,又稱端序尾序,英文:Endianness

在計算機科學領域中,字節序是指存放多字節數據的字節(byte)的順序,典型的情況是整數在內存中的存放方式和網絡傳輸的傳輸順序。Endianness有時候也可以用指位序(bit)。

大小端序跟硬件的體系結構有關,所有x86系列的pc機都是小端序,跟操作系統無關。在x86系列的pc上的solaris系統是小端序,sun sparc平臺的solaris是大端序。

大端字節序,高字節存於內存低地址,低字節存於內存高地址;小端字節序反之。

如一個long型數據0x12345678
大端字節序:
內存低地址--> 0x12
                    0x34
         0x56
內存高地址--> 0x78

小端字節序:
內存低地址--> 0x78      
       0x56
       0x34
內存高地址--> 0x12



  1. 二、大端序和小端序

 

大端序(英:big-endian)或稱大尾序

Big-Endian.svg
數據以8bit爲單位:

地址增長方向  →

...

0x0A

0x0B

0x0C

0x0D

...

示例中,最高有效位(MSB, Most Significant Byte)是0x0A 存儲在最低的內存地址處。下一個字節0x0B存在後面的地址處。正類似於十六進制字節從左到右的閱讀順序。

數據以16bit爲單位:

地址增長方向  →

...

0x0A0B

0x0C0D

...



最高的16bit單元0x0A0B存儲在低位。

小端序(英:little-endian)或稱小尾序。

Little-Endian.svg

數據以8bit爲單位:

地址增長方向  →

...

0x0D

0x0C

0x0B

0x0A

...

最低有效位(LSB,Least Significant Byte)是0x0D 存儲在最低的內存地址處。後面字節依次存在後面的地址處。

數據以16bit爲單位:

地址增長方向  →

...

0x0C0D

0x0A0B

...



最低的16bit單元0x0C0D存儲在低位。

採用大端序的CPU和採用小端序的CPU不僅在字節上是相反的,在比特位上也是相反的。
比如0x01在內存中的存儲
大端序:內存低比特位 00000001 內存高比特位
小端序:內存低比特位 10000000 內存高比特位

比如0x00000001
大端序:內存低比特位 00000000 00000000 00000000 00000001 內存高比特位
小端序:內存低比特位 10000000 00000000 00000000 00000000 內存高比特位

三、判定方法

typedef struct tagRegion{
    unsigned char region1:1;
    unsigned char region2:6;
    unsigned char region3:1;
} REGION;
 
union {
 REGION bb;
 unsigned char aa;
} cc;
 
int main(int argc, char* argv[])
{
    cc.bb.region1 =1;
   printf("Hello World! %d/n",cc.aa);   //打印1表示小端,打印128表示大端。
   return 0;
}

  

static unsigned char isBigEndian()
{
        const unsigned short test= 0xFF00;
        return *((unsigned char *) &test);
};

  使用以下方式更簡潔一些:

複製代碼

 #include <iostream>
   std;
 
  main( argc,  **argv)
 {
      s = ;
     ((*(unsigned *)&s) == )
         cout<<<<endl;
      ((*(unsigned *)&s) == )
         cout<<<<endl;
     
         cout<<<<endl;
  
      ;
 }

複製代碼原文轉自:http://www.cnblogs.com/flysnail/archive/2011/10/25/2223721.html


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