大端序和小端序

大端序和小端序

一、概述

字节序,又称端序尾序,英文: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)或称大尾序


数据以8bit为单位:

地址增长方向  →

...

0x0A

0x0B

0x0C

0x0D

...

示例中,最高有效位(MSB, Most Significant Byte)是0x0A 存储在最低的内存地址处。下一个字节0x0B存在后面的地址处。正类似于十六进制字节从左到右的阅读顺序。

数据以16bit为单位:

地址增长方向  →

...

0x0A0B

0x0C0D

...



最高的16bit单元0x0A0B存储在低位。

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

数据以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


你可能感兴趣的:(网络,操作系统,英文,领域,计算机科学)