int型在内存中的存储方式与高低字节(大小端)

    技术2022-05-19  35

    首先明确一点:结构体中的成员是从低地址向高地址排列的,这一点和数组类似,即排在结构体前面的成员占用内存低地址,排在结构体后面的成员占用内存高地址。

    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/字节序

     


    最新回复(0)