You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Linux在byteorder.h中定义__LITTLE/BIG_ENDIAN_BITFIELD宏?

核心疑问

Linux为何将位域分配顺序相关宏命名为__LITTLE_ENDIAN_BITFIELD/__BIG_ENDIAN_BITFIELD并置于byteorder.h中,而非使用__LEAST_TO_MOST_BITFIELD/__MOST_TO_LEAST_BITFIELD这类命名并放在bitfield.h类文件中?


Linux相关代码示例

include/uapi/linux/ip.h

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
    __u8    tos;
    __be16  tot_len;
    __be16  id;
    __be16  frag_off;
    __u8    ttl;
    __u8    protocol;
    __sum16 check;
    __struct_group(/* no tag */, addrs, /* no attrs */,
        __be32  saddr;
        __be32  daddr;
    );
    /*The options start here. */
};

include/uapi/linux/byteorder/little_endian.h

#ifndef __LITTLE_ENDIAN
#define __LITTLE_ENDIAN 1234
#endif
#ifndef __LITTLE_ENDIAN_BITFIELD
#define __LITTLE_ENDIAN_BITFIELD
#endif

位域分配顺序

“Endian(字节序)”本应与位域分配顺序无关:

  • C17标准(N2310草案) 规定,位域在存储单元内的分配顺序(从高位到低位或低位到高位)由实现定义。
  • LSB 5.0规范 中,大端架构S390的字节序与位域分配为同级规范,位域要求从左到右(最高位到最低位)分配,与字节序一致。

位传输顺序

“Endian(字节序)”与位传输顺序(先传最高位或最低位)无关,该顺序由总线控制器和NIC处理。


预期

由于二者独立,应使用__LEAST_TO_MOST_BITFIELD/__MOST_TO_LEAST_BITFIELD这类宏,置于bitfield.h类文件中。


其他参考

RFC791 附录B规定,Version = bytes[0] >> 4,IHL = bytes[0] & 0x0f,且字节中最左侧为最高有效位。


内容的提问来源于stack exchange,提问作者YouJiacheng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:20:22