位字段如何与字符类型一起使用?

struct stats { char top : 1; char bottom : 1; char side : 2; } MyStat; 

我用整数看过这种格式但是上面的char位字段是如何工作的以及它代表什么?

谢谢。

字符串字段的工作方式与int相同,只是基本类型是8位宽,而不是32位。 因此,您将获得一个结构统计信息,其大小为1个字节,以及3个成员变量,总共占用4位。

Bitfields应该使用类型signed intunsigned int或来自 bool声明。 其他类型可能合法也可能不合法(取决于平台),但要注意签名 – 普通int可能被认为是无符号的位域。

也就是说,它可能是编译器的一个提示,即struct的对齐应该是1而不是sizeof(int) 。 并且允许编译器接受char并为其分配这样的含义。

根据C99 6.7.2.1/9,

位字段被解释为由指定位数组成的有符号或无符号整数类型。 如果将值0或1存储到_Bool类型的非零宽度位字段中,则位字段的值应等于存储的值。

和脚注:

如上面6.7.2中所述,如果使用的实际类型说明符是int或定义为int的typedef-name,则无论位字段是有符号还是无符号,它都是实现定义的。

它只是定义了您将使用的变量的大小。

 char int 

标准不支持这一点(典型的使用是unsigned int),但这是一个很好的尝试:)

re:你的查询,这是实现者尝试为他们的位域使用更少的内存(char而不是unsigned int)

此外,从Atmel ,我们得到:

在C标准中,只有“unsigned(int)”和“int”是位域成员可接受的数据类型。 有些编译器允许“unsigned char”……..