关于CPU的字节顺序
今天遇到字节序的问题,决定把这个问题搞清楚。
字节序就讲的是占用多个字节的数据类型(int,long等)在内存中的存放顺序,比如一个int型,大小为109486163(为什么要用这个数举例?往下看就知道 了),用16进制的形式表示就是0x41424344,这个数在内存中是如何存放的呢,假设其址为0,这个int分配的地址也为0,那么,在地址0,1,2,3,上的值分别是多少?但愿这篇文章可以回答这个问题。
字节序通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;也就
是低地址存放最低有效字节(LSB)。
大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。也就是是指低地址存放最高有效字节(MSB)
。
下图显示了数据的0x41424344在两种字节顺序中的排列:
大端字节顺序
小端字节顺序
基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。JAVA字节序也是(大端字节序)BIG-ENDIAN。
下面用一个小程序来看看Intel使用的是是不是小端字节序(如果不是,那9成[留条后路先]是程序错了)。
动态判断CPU字节序列:
1/************************************************************************
2函数功能: 动态判断字节顺序
3返回值 : 见枚举BYTEORDER定义
4/************************************************************************/
5BYTEORDER GetByteOrder()
6{
7 BYTEORDER eByteOrder = BO_UNKNOWN;
8 union
9 {
10 unsigned short int s;
11 unsigned char arr[sizeof (unsigned short int)];
12 }un;
13 un.s = 0x1234;
14
15 if ( 0x12 == un.arr[0] && 0x34 == un.arr[1])
16 {
17 eByteOrder = BO_BIG_ENDIAN;
18 }
19 else if ( 0x34 == un.arr[0] && 0x12 == un.arr[1])
20 {
21 eByteOrder = BO_LITTLE_ENDIAN;
22 }
23 else
24 {
25 eByteOrder = BO_UNKNOWN;
26 }
27 return eByteOrder;
28}
2函数功能: 动态判断字节顺序
3返回值 : 见枚举BYTEORDER定义
4/************************************************************************/
5BYTEORDER GetByteOrder()
6{
7 BYTEORDER eByteOrder = BO_UNKNOWN;
8 union
9 {
10 unsigned short int s;
11 unsigned char arr[sizeof (unsigned short int)];
12 }un;
13 un.s = 0x1234;
14
15 if ( 0x12 == un.arr[0] && 0x34 == un.arr[1])
16 {
17 eByteOrder = BO_BIG_ENDIAN;
18 }
19 else if ( 0x34 == un.arr[0] && 0x12 == un.arr[1])
20 {
21 eByteOrder = BO_LITTLE_ENDIAN;
22 }
23 else
24 {
25 eByteOrder = BO_UNKNOWN;
26 }
27 return eByteOrder;
28}
还记得一开始那个int值吗,现在我们要把这个int分解成4个char,分别是ABCD,并输出。如下图所示。程序就不贴了,需要请在附件中下载。
更多内容,您可以移步这里