现代CPU的累加器一次至少能加载4个字节,即一个整数。这4个字节在内存中的排序将影响它被累加器装载成的整数的值。这就是字节序问题。字节序分为大端序与小端序,即big endian、little endian。
大端序是指一个整数的高位字节存储在内存地址的低地址处,低位字节存储在内存高地址处。小端序正好相反。下面看0x0102在两种内存结构中的存储方式。
0x0102占两个字节:高位字节 01:0000 0001,低位字节02:0000 0010
内存地址位: 低 ---------------->高
大端序中的存储结构:0000 0001 | 0000 0010
小端序中的存储结构:0000 0010 | 0000 0001
下面看测试代码
void test()
{
union MyUnion
{
short v;
char c[sizeof(short)];
};
MyUnion mu;
mu.v = 0x0102;
if (int(mu.c[0]) == 1 && int(mu.c[1]) == 2)
{
cout << "big endian" << endl;
}
else
{
cout << "little endian" << endl;
}
}
mu.c[0]取低地址处的值,mu.c[1]取高地址处的值,结果一目了然。
为了解决不同字节序的主机在网络中传输数据的问题,TCP/IP协议规定了网络字节序,即不管主机采用了什么字节序,如果你要通过TCP/IP进行网络传输就必须转换成网络字节序。网络字节序采用大端字节序。