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

T.T*_*.T. 5 c c++ bit-manipulation char

   struct stats
   {
       char top         : 1; 
       char bottom      : 1;
       char side        : 2;
   } MyStat;  
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

小智 5

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


Pot*_*ter 5

应使用type signed int,from unsigned intboolfrom 声明位域<stdbool.h>.其他类型可能是合法的(也可能不是合法的)(取决于平台),但要注意签名 - int可以将plain 视为未签名的位域.

也就是说,它可能是编译器的一个暗示,它的对齐struct应该是1而不是sizeof(int).并允许编译器接受char并赋予它这样的含义.

根据C99 6.7.2.1/9,

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

和脚注:

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

  • C99在6.7.2.1/4"_Bool,signed int,unsigned int或其他一些实现定义类型"中明确说明了这一点.据推测,实现可以自由地定义位字段容器对象是否真的像单个`char`一样小,因为在这种情况下它可能就像它一样. (3认同)