struct stats
{
char top : 1;
char bottom : 1;
char side : 2;
} MyStat;
我用整数看过这种格式,但上面的char位字段是如何工作的以及它代表什么?
谢谢。
答案 0 :(得分:5)
字符位字段的工作方式与int相同,只是基本类型是8位宽,而不是32位。因此,您将获得一个结构统计信息,其大小为1个字节,以及3个成员变量,总共占用4位。
答案 1 :(得分:5)
应使用signed int
中的unsigned int
,bool
或<stdbool.h>
类型声明位域。其他类型可能合法也可能不合法(取决于平台),但要注意签名 - 普通int
可能会被视为未签名的位域。
也就是说,对于编译器来说,struct
的对齐应该是1而不是sizeof(int)
可能是一个提示。并允许编译器接受char
并赋予它意义。
根据C99 6.7.2.1/9,
位字段被解释为由指定位数组成的有符号或无符号整数类型。如果将值0或1存储到_Bool类型的非零宽度位字段中,则位字段的值应等于存储的值。
和脚注:
如上面6.7.2中所述,如果使用的实际类型说明符是
int
或typedef-name定义为int
,那么它是实现定义的,无论位字段是有符号的还是无符号的。
答案 2 :(得分:2)
它只定义了您将使用的变量的大小。
char
int
标准不支持这一点(典型的使用是unsigned int),但这是一个很好的尝试:)
re:你的查询,这是实现者尝试为他们的位域使用更少的内存(char而不是unsigned int)
此外,从Atmel,我们得到:
在C标准中,只是“未签名 (int)“和”int“是可以接受的 位域成员的数据类型。一些 编译器允许“unsigned char” ........