1、端序简介(维基百科):
端序(Endianness),又称字节序、尾序。在计算机科学领域中,端序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。Endianness有时候也可以用指位序(bit)。
对于单一的字节(a byte),大部分处理器以相同的顺序处理位元(bit),因此单字节的存放方法和传输方式一般相同。
对于多字节数据,如整数(32位机中一般占4字节),在不同的处理器的存放方式主要有两种,以内存中0x0A0B0C0D的存放方式为例,分别有以下几种方式:
1)大端序(英:big-endian)或称大尾序。
数据以8bit为单位:
地址增长方向 →
...
0x0A
0x0B
0x0C
0x0D
...
示例中,最高有效位(MSB, Most Significant Byte)是0x0A 存储在最低的内存地址处。下一个字节0x0B存在后面的地址处。正类似于十六进制字节从左到右的阅读顺序。
数据以16bit为单位:
地址增长方向 →
...
0x0A0B
0x0C0D
...
最高的16bit单元0x0A0B存储在低位。
2)小端序(英:little-endian)或称小尾序。
数据以8bit为单位:
地址增长方向 →
...
0x0D
0x0C
0x0B
0x0A
...
最低有效位(LSB,Least Significant Byte)是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。
数据以16bit为单位:
地址增长方向 →
...
0x0DOC
0x0BOA
...
最低的16bit单元0xOD0C存储在低位。
3)混合序(英:middle-endian)具有更复杂的顺序。
以PDP-11为例,0x0A0B0C0D被存储为:
32bit在PDP-11的存储方式
地址增长方向 →
...
0x0B
0x0A
0x0D
0x0C
...
可以看作最高的16bit位和低位以大端序存储,但16bit内部以小端存储。
2、代码实现:
测试思想主要是应用c语言的指针,以浮点数125.5为例,浮点数的在内存的存储方式可参看博文:
float型数据125.5转换为标准浮点格式:0 10000101 11110110000000000000000
则在内存中存放方式为:
1)小端
00000000 低地址
00000000
11111011
01000010 高地址
2)大端
00000000 高地址
00000000
11111011
01000010 低地址
代码如下:
#include
int main(int argc, char *argv[])
{
float a=125.5;
char *p=(char *)&a;
printf("%d ",*p);
printf("%d ",*(p+1));
printf("%d ",*(p+2));
printf("%d\n",*(p+3));
return 0;
}
如果是小端,则结果: 0 0 -5 66
如果是大端,则结果: 66 -5 0 0
另外,也可以用以下更加简便的代码测试:
int main()
{
unsigned int a=65;//A的ASCII码为65
char *p=(char *)a;
printf("%c",a);
return 0;
}
如果输出是A,则可判断为小端序。
3、处理器体系(维基百科):