如何理解4.4BSD的ip头定义?

时间:2015-05-01 02:48:05

标签: c bsd

struct ip {
#if BYTE_ORDER == LITTLE_ENDIAN
    u_char  ip_hl:4,
            ip_v:4;
#endif
#if BYTE_ORDER == BIG_ENDIAN
    u_char  ip_v:4,
            ip_hl:4;
#endif
  ......
};

为什么它会更改ip_hlip_v的字节偏移量?我认为big endian和little endian用于描述单词中字节的位移。

1 个答案:

答案 0 :(得分:0)

为了对术语迂腐,重要的是要意识到位域的偏移并没有真正改变 - 而是改变了位域的顺序。如果存在三个大小相等的位域,则不会看到中间位置的偏移量有任何差异,并且意图是颠倒其分配顺序的事实将更加明显。

是的,“endian”通常描述一个字的字节顺序,但是对于所有4.4BSD系统,位域的分配顺序也遵循该系统CPU架构的字的字节顺序。

(我认为对于所有UNIX System V ABI来说实际上也可能如此 - 它已经出现在我所知道的所有内容中。有非unix系统,但不遵循这个经验法则!)