在位域中,为什么中间有些位是空的?

时间:2019-06-17 10:25:05

标签: c

定义位字段时,可以在中间保留一些位空白,并将成员分配给特定位。 为什么中间有些空位?

struct product {
    unsigned int code : 6;    // product code : 6 bit
    unsigned int : 10;    // not use 10 bit
    unsigned int color : 5;    // product color : 5 bit
    unsigned int : 5;    // not use 5 bit
    unsigned int size : 6;    // product size : 3 bit
};

我不知道为什么我不使用中间的钻头

3 个答案:

答案 0 :(得分:5)

位域的结构可避免跨越字和字节边界。前两个,6和10位加起来为16位,而其他三个,5、5和6也加起来为16位。将一个位字段作为2个单独的16位字的一部分可能是非常低效的。

答案 1 :(得分:2)

这是一个未命名的位字段,基本上是使用定义的位填充。来自C17 6.7.2.1:

  

没有声明符,但只有一个冒号和一个宽度的位域声明表示一个   未命名的位字段。作为特殊情况,宽度为0的位域结构成员表示没有其他位域将被打包到放置前一个位域(如果有)的单元中。

所以我想它是用来获取某种内存布局的,也许是与某种预定义的硬件寄存器或通信协议相对应的。

但是也请注意,哪个位是MSB并没有明确定义,并且编译器可以自由添加自己的填充,因此该位字段不能在编译器或系统之间移植。出于任何目的,最好完全避免使用位域。

答案 2 :(得分:2)

这是一个非常方便的功能。大多数硬件寄存器都有未使用/保留位的间隙,例如:

enter image description here

未命名的位域使我们避免使用具有reserved1reserved2,...名称的字段