大小端序存储问题—转
大小端序是针对于不同的硬件而言的,具体的就是不同的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的存储方式,一目了然
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 ;

浙公网安备 33010602011771号