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存储在低位。
![](http://static.oschina.net/uploads/space/2012/1220/133031_jDf1_922237.png)
3)混合序(英:middle-endian)具有更复杂的顺序。
以PDP-11为例,0x0A0B0C0D被存储为:
- 32bit在PDP-11的存储方式
地址增长方向 → | |||||
... | 0x0B | 0x0A | 0x0D | 0x0C | ... |
可以看作最高的16bit位和低位以大端序存储,但16bit内部以小端存储。
测试思想主要是应用c语言的指针,以浮点数125.5为例,浮点数的在内存的存储方式可参看博文:
http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html
float型数据125.5转换为标准浮点格式:0 10000101 11110110000000000000000
则在内存中存放方式为:
1)小端
00000000 低地址
00000000
11111011
01000010 高地址
2)大端
00000000 高地址
00000000
11111011
01000010 低地址
代码如下:
#include <stdio.h>
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、处理器体系(维基百科):
x86,MOS Technology 6502,Z80,VAX,PDP-11等处理器为Little endian。 Motorola 6800,Motorola 68000,PowerPC 970,System/370,SPARC(除V9外)等处理器为Big endian ARM, PowerPC (除PowerPC 970外), DEC Alpha, SPARC V9, MIPS, PA-RISC and IA64的字节序是可配置的。