我想知道内核编译器将如何处理不同的字节序位域:
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
......
};
Run Code Online (Sandbox Code Playgroud)
该结构体iphdr占用1个字节。在小端机中,第一个字段ihl占用位 0、1、2、3,第二个字段version占用位 4、5、6、7。 ihl首先列出并获取最低有效位。在秒的情况下,version首先列出的 获得第一位。由于这是大端字节序,因此第一位是位 7、6、5、4。 ihl获取接下来的四位,3,2,1,0。
使用 #if 条件,无论是在大端机还是小端机中编译,这些位都位于字节内的相同位偏移位置。
当这些字段处于相同的位定位时,各种掩码和移位操作会给出相同的结果。
有趣的是,“小端序”和“大端序”一词源自故事《格列佛游记》。在那里,人们为了先敲开煮鸡蛋的哪一端而争论不休。因此大端与小端。这是一个恰当的名字,用来形容关于哪个更正确的毫无意义的争论。(我有点字节序。)
此外,同一个故事还引入了另一个计算机术语:雅虎。