结构中的位域概念

Bitfield concept in structure

#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。您能解释一下它的内部工作原理吗?

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

大多数机器都不能位寻址,所以它真的不能创建 9 位宽的对象。它本可以选择 16 位,并且您可以使用一些 #pragmaattribute 魔法说服它这样做。 32 位可能是提供最佳性能的最原始大小。

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

implementation may allocate any addressable storage unit large enough to hold a bitfield. If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit. If insufficient space remains, whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is implementation-defined.....

在你的例子中,由于(第一个变量类型)int 大小足以将所有位域变量打包成一个 int,它正在这样做。

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

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


[由社区编辑添加]

  • 案例一:

    如果您使用 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”,因为它需要 2 chars 来存储总共 9 位。

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