首先,是否可以这样做? 如果是,我在下面的声明中做错了什么?
struct mybitfields
{
uint8_t a : 4;
uint16_t c : 12;
} test;
答案 0 :(得分:4)
虽然你正在做的是可能,但它不是可移植的:C99标准说比特字段基类型必须是_Bool
,{{ 1}}或signed int
,允许实现定义的类型与位字段一起使用(C90需要在无符号unsigned int
上签名作为位字段的基类型;不允许其他类型)。
有关C99和C90标准的相应章节的参考,请参见this answer。
如果您的目标是定义int
大小小于struct
的位字段,那么最好使用位移来实现可移植性。
答案 1 :(得分:3)
大多数编译器都会接受您的代码,但严格来说,位域的基本类型必须是(signed / unsigned) int
。
uint8_t
是unsigned char
的typedef,uint16_t
可能是unsigned short
的typedef,而且这些类型的位域不符合。