Bitfield概念在结构中

时间:2015-07-03 09:27:31

标签: c struct bit-fields

#include<stdio.h>

int main()
{
        struct value
        {
                int bit1:1;
                int bit2:4;
                int bit3:4;
        }bit;

        printf("%d\n",sizeof(bit));
}

我正在使用GCC,它向我显示sizeof(bit)值为4.你能解释一下它在内部是如何工作的吗?

2 个答案:

答案 0 :(得分:1)

编译器决定在单个int中布置位域,在您的平台上为32位。这意味着整个结构需要32位,即使结构的可用部分较小。

大多数机器都不是位可寻址的,因此它实际上无法创建9位宽的对象。它本可以选择16位,你可以用一些#pragmaattribute魔法来说服它。 32位可能是最原始的大小,可以提供最佳性能。

答案 1 :(得分:1)

引用C11标准,第§6.7.2.1章,结构和联合说明符,(强调我的

  

实现可以分配足够大的任何可寻址存储单元来保存位域。 如果剩余足够的空间,则紧跟在结构中另一个位字段之后的位字段将被打包到同一单元的相邻位中。如果剩余的空间不足,则是否存在不存在的位字段fit适用于下一个单元或重叠相邻单元是实现定义的.....

在您的情况下,由于(第一个变量类型)int大小足以将所有位变量变量打包到一个int中,所以它会这样做。

因此,在32位系统中,您的sizeof(bit)基本上等同于sizeof(int),可能会产生值4

也就是说,sizeof生成size_t类型的值。您应该使用%zu格式说明符来打印该值。

[社区编辑添加]

  • 案例1:

    如果您使用char,如下所示,它会将大小显示为1,因为7位可以放在char中。

    #include<stdio.h>
    
    int main(void)
    {
        struct value
        {
                char bit1:1;
                char bit2:2;
                char bit3:4;
        }bit;
    
        printf("%d\n",sizeof(bit));
    }
    
  • 案例2:

    在下面的情况下,结果将是&#39; 2&#39;因为它总共需要2 char来存储9位。

        char bit1:1;
        char bit2:4;
        char bit3:4;