2

我想知道内核的编译器会对不同的字节序位域做什么:

struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8
    ihl:4,
    version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8
    version:4,
    ihl:4;
#else
    #error "Please fix <asm/byteorder.h>"
#endif
......
};
4

1 回答 1

3

该结构iphdr占用 1 个字节。在小端机器中,第一个字段ihl占用 0、1、2、3 位,第二个字段version占用 4、5、6、7 位。 ihl首先列出并获取最低有效位。在秒的情况下,version, 首先列出获得第一位。由于这是大端序,因此第一位是 7、6、5、4 位。 ihl得到接下来的四位,3,2,1,0。

使用#if 条件,无论是在大端还是小端机器中编译,位都位于一个字节内的相同位偏移位置。

使用相同位定位中的这些字段,各种掩码和位移操作给出相同的结果。


有趣的是,小端和大端这两个词起源于故事格列佛游记。在那里,人们争论了一场毫无意义的战争,关于首先破解一个煮熟的鸡蛋的哪一端。因此大端与小端。一个关于哪个更正确的毫无意义的辩论的恰当名称。(我有点字节序。)


此外,同样的故事还引入了另一个计算机术语:yahoo。

于 2013-08-06T05:07:31.060 回答