定义位字段时,可以在中间保留一些位空白,并将成员分配给特定位。 为什么中间有些空位?
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
};
我不知道为什么我不使用中间的钻头
答案 0 :(得分:5)
位域的结构可避免跨越字和字节边界。前两个,6和10位加起来为16位,而其他三个,5、5和6也加起来为16位。将一个位字段作为2个单独的16位字的一部分可能是非常低效的。
答案 1 :(得分:2)
这是一个未命名的位字段,基本上是使用定义的位填充。来自C17 6.7.2.1:
没有声明符,但只有一个冒号和一个宽度的位域声明表示一个 未命名的位字段。作为特殊情况,宽度为0的位域结构成员表示没有其他位域将被打包到放置前一个位域(如果有)的单元中。
所以我想它是用来获取某种内存布局的,也许是与某种预定义的硬件寄存器或通信协议相对应的。
但是也请注意,哪个位是MSB并没有明确定义,并且编译器可以自由添加自己的填充,因此该位字段不能在编译器或系统之间移植。出于任何目的,最好完全避免使用位域。
答案 2 :(得分:2)