有没有办法用位字段声明无符号固定宽度整数?

时间:2013-04-22 21:23:03

标签: c embedded

首先,是否可以这样做? 如果是,我在下面的声明中做错了什么?

struct mybitfields
{
    uint8_t a : 4;
    uint16_t c : 12;
} test;

2 个答案:

答案 0 :(得分:4)

虽然你正在做的是可能,但它不是可移植的:C99标准说比特字段基类型必须是_Bool,{{ 1}}或signed int,允许实现定义的类型与位字段一起使用(C90需要在无符号unsigned int上签名作为位字段的基类型;不允许其他类型)。

有关C99和C90标准的相应章节的参考,请参见this answer

如果您的目标是定义int大小小于struct的位字段,那么最好使用位移来实现可移植性。

答案 1 :(得分:3)

大多数编译器都会接受您的代码,但严格来说,位域的基本类型必须是(signed / unsigned) int

uint8_tunsigned char的typedef,uint16_t可能是unsigned short的typedef,而且这些类型的位域不符合。