位字段如何与字符类型一起使用?
struct stats { char top : 1; char bottom : 1; char side : 2; } MyStat;
我用整数看过这种格式但是上面的char位字段是如何工作的以及它代表什么?
谢谢。
字符串字段的工作方式与int相同,只是基本类型是8位宽,而不是32位。 因此,您将获得一个结构统计信息,其大小为1个字节,以及3个成员变量,总共占用4位。
Bitfields应该使用类型signed int
, unsigned 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”……..