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

时间:2010-10-19 17:38:37

标签: c++ c char bit-manipulation

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

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

谢谢。

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

应使用signed int中的unsigned intbool<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”   ........