大端序和小端序的差别
代码如下:
?
#include <iostream>using namespace std;typedef struct{ unsigned char a1: 1; unsigned char a2: 1; unsigned char a3: 1; unsigned char a4: 1; unsigned char a5: 1; unsigned char a6: 1; unsigned char a7: 1; unsigned char a8: 1;}Data;int main(int argc, char** argv){ unsigned char a = 0xab;//10101011 Data *test = (Data*)&a; cout<<(unsigned int)test->a1<<(unsigned int)test->a2; cout<<(unsigned int)test->a3<<(unsigned int)test->a4; cout<<(unsigned int)test->a5<<(unsigned int)test->a6; cout<<(unsigned int)test->a7<<(unsigned int)test->a8<<endl; unsigned short data=0X8284; unsigned char *p = (unsigned char*)&data; if(*p == 0X82) { cout<<"big endian order"<<endl; } else if(*p == 0x84) { cout<<"little endian order"<<endl; } return 0;}?
环境:
bash-2.05$ uname -a
SunOS test 5.9 Generic_112233-12 sun4u sparc SUNW,Ultra-80
输出结果:
10101011
big endian order
环境:
test@develop:~$ uname -a
Linux develop 2.6.35-24-generic #42-Ubuntu SMP Thu Dec 2 02:41:37 UTC 2010 x86_64 GNU/Linux
输出结果:
11010101
little endian orde
结论:
大端序:低地址存放高位,不管是在字节之间还是字节内部,内存中存放数据的位置跟我们头脑中以及教科书上的顺序是一致的,比如数字0X1234,在内存中存放的序列是:0001 0010 0011 0100
小端序:地地址存放低位,顺序刚好跟大端序相反,比如数字0X1234,在内存中存放的序列是:0010 1100 0100 1000
大小端序跟硬件的体系结构有关,所有x86系列的pc机都是小端序,跟操作系统无关(网上都这么说,可是无法验证,但在x86系列的pc上的solaris系统是小端序,sun sparc平台的solaris是大端序,这个本人验证过)
补充:
我们经常用移位操作,但从来没感受到大小端序对我们程序代码的影响,个人认为是操作系统或者编译器底层实现移位操作的时候屏蔽掉了这些细节,也就是说大端序和小端序平台的移位操作在实现上应该是不一样的,但给我们使用者的感受是一样的