首先明确一点:结构体中的成员是从低地址向高地址排列的,这一点和数组类似,即排在结构体前面的成员占用内存低地址,排在结构体后面的成员占用内存高地址。
union int_char {
int a;
char b[4];
}ton;
ton.a = 0x02ff03ff;
printf("%d %d %d %d/n", ton.b[0], ton.b[1], ton.b[2], ton.b[3]);
输出:
-1 3 -1 2
b[1]存储的是0x03,b[3]存储的是0x02,对于整数0x02ff03ff其高字节0x02放在了b[3],b[3]占用的是内存的高地址,即高位字节排在内存的高地址,所以为小端字节序。我的机器也是X86的,与机器的字节序是一致的。
再看看IP地址的表示方法:
struct in_addr {
union {
struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { USHORT s_w1,s_w2; } S_un_w;
ULONG S_addr;
} S_un;
如果 S_un.S_addr = 2171906240; //(0x8174a8c0)
对应的IP地址是192.168.116.129,输出形式为:printf("%d.%d.%d.%d\n", S_un.S_un_b.s_b1, S_un.S_un_b.s_b2, S_un.S_un_b.s_b3, S_un.S_un_b.s_b4);即可正确输出。
也是低位字节(如0xco)对应内存的低地址(s_b1)。
同样这也是在我的机器上观察到了,与X86的字节序一致。一般进行网络编程传输次序为为网络字节序,即大端字节序。所以在小端字节序的机器上应进行相应的转换。
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
c) 网络字节序:网络传输一般采用大端序,也被称之为网络字节序,或网络序。IP协议中定义大端序为网络字节序。
http://zh.wikipedia.org/zh-cn/%E5%AD%97%E8%8A%82%E5%BA%8F