大小端序存储问题—转

大小端序是针对于不同的硬件而言的,具体的就是不同的CPU 是不同的处理的。 对于 Intel x86 系列就是小端序。

简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了。注意字节序是硬件层面的东西,对于软件来说通常是透明的。再说白一点,字节序通常只和你使用的处理器架构有关,而和编程语言无关。

Big(大端序):

数据的高位字节存放在地址的低端 低位字节存放在地址高端

Little(小端序):

数据的高位字节存放在地址的高端 低位字节存放在地址低端

 

字节的高位与低位:
举个例子,int a =0x12345678 ; 那么左边12就是高位字节,右边的78就是低位字节,从左到右,由高到低,(注意,高低乃相对而言,比如56相对于78是高字节,相对于34是低字节 )


关于地址的高端与低端:
0x00000001              // 相对于下面三个是低端
0x00000002
0x00000003
0x00000004               //相对于上面三个是高端

 

字节序如何存储数据:

假设从地址 0x00000001 处开始存储十六进制数 0x52365670 

( 1.)对于大端而言:

                  0x00000001          // 储存52
                  0x00000002           //储存36
                  0x00000003           //储存56
                  0x00000004           //储存70

( 2.)对于小端而言:

 

                  0x00000001          // 储存70
                  0x00000002           //储存56
                  0x00000003           //储存36
                  0x00000004           //储存52

总结:大端序是按照数字的书写顺序进行存储的,而小端序是颠倒书写顺序进行存储的。

----------------------------------- 代码判断方法:-------------------------------------------------

 

 1 bool isBig()
 2 {
 3    int a =1 ; 
 4 
 5     
 6    if( ( ( char *) &a )[3]== 1 ) // 标准的写法是将a[3]替换为a[sizeof( int) - 1]
 7     {
 8 
 9        return true ;
10 
11     }
12    else
13     {
14 
15        return false ;
16 
17    }
18 }

 

打开VS的内存窗口,看一下a的存储方式,一目了然

a是int,所以占四个字节,其值是00000001,存储方式如下:所以a[3]是0,不是大端序。
 

0x0012FE88  01         // a[0]

0x0012FE89  00         // a[1]

0x0012FE8A  00         // a[2]

0x0012FE8B  00         // a[3]

 

---->当然还有方法也是可以的:就是使用 “Union ”

 1 bool isBig()
 2 {
 3 union
 4 {
 5 unsigned shorta ;
 6 char b ;
 7 } c;
 8 
 9 c.a = 0x0102 ;
10 
11 if(c.b ==1)
12 {
13 return true ;
14 }
15 else
16 {
17 return false ;

 

posted @ 2012-07-27 15:05  戊辰岁终  阅读(204)  评论(0)    收藏  举报