关于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
/************************************************************************/
5
BYTEORDER 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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
还记得一开始那个int值吗,现在我们要把这个int分解成4个char,分别是ABCD,并输出。如下图所示。程序就不贴了,需要请在附件中下载。
更多内容,您可以移步这里