原文转载于:http://blog.csdn.net/shanshanpt/article/details/7365613
其实 大小端序是针对于不同的硬件而言的,具体的就是不同的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
总结:大端序是按照数字的书写顺序进行存储的,而小端序是颠倒书写顺序进行存储的。
———————————– 代码判断方法:————————————————-
bool isBig()
{
int a =1;
if( ( (char *)&a )[3]==1 ) // 标准的写法是将a[3]替换为a[sizeof( int) - 1]
{
return true ;
}
else
{
returnfalse ;
}
}
打开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 ”
bool isBig()
{
union
{
unsigned shorta ;
char b ;
} c;
c.a = 0x0102;
if(c.b==1)
{
return true;
}
else
{
return false;