C 位字段的整数类型

C 位字段的整数类型,c,bit-fields,C,Bit Fields,位字段的整数类型是重要的,还是基本上是一次性的,例如: struct font { int bold : 1; int italics : 2; int underline : 1; }; vs vs 不同的整数类型在这里“起作用”吗?或者它基本上是占位符吗?位字段是否使用有符号或无符号类型会使其可以保存的值不同。在第一个示例中,bold可以保存值0或-1,而在第二个示例中,bold可以保存值0和1 C标准特别允许int、unsigned int或\u Bool作为位字

位字段的整数类型是重要的,还是基本上是一次性的,例如:

struct font {
    int bold : 1;
    int italics : 2;
    int underline : 1;
};
vs

vs


不同的整数类型在这里“起作用”吗?或者它基本上是占位符吗?

位字段是否使用有符号或无符号类型会使其可以保存的值不同。在第一个示例中,
bold
可以保存值0或-1,而在第二个示例中,
bold
可以保存值0和1

C标准特别允许
int
unsigned int
\u Bool
作为位字段的类型,并支持实现定义的其他类型。大多数实现都允许位字段使用任何整数类型


对于那些这样做的,类型指定位字段所在的“bucket”的大小,因此它可以影响结构的大小。在我的gcc机器上,前两个结构的大小为4,而第三个结构的大小为1。

Well,
int bold:1
只能是
-1
0
,而
无符号整数粗体:1可以是
1
0
@KamilCuk。如果我设置
bold=1
,编译器不会抱怨,但是如果我设置
bold=2
,编译器会抱怨。如果设置
char a=1000,编译器也不会抱怨
,但是
char
只能(通常;)将
-128
保存到
127
。。。该值将转换为目标类型的范围。有一个问题需要澄清。这句话:“C标准特别允许int、unsigned int或_Bool”--你的意思是“位字段的C标准…?@David542是的。更新了。
struct font {
    unsigned int bold : 1;
    unsigned int italics : 2;
    unsigned int underline : 1;
};
struct font {
    char bold : 1;
    char italics : 2;
    char underline : 1;
};