具有位域的结构的大小

Nir*_*aIn 3 c bit-fields

这里我有一个代码片段。

#include <stdio.h>
int main()
{
    struct value
    {
        int bit1 : 1;
        int bit2 : 4;
        int bit3 : 4;
    } bit;

    printf("%d",sizeof(bit));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出为 4(32 位编译器)。谁能解释我怎么做?为什么不是 1+ 4 + 4 = 9?我以前从未使用过位域,所以希望得到一些帮助。谢谢你。:)

sam*_*ris 7

当您告诉 C 编译器时:

int bit1 : 1
Run Code Online (Sandbox Code Playgroud)

它将它解释为一个整数,并将其分配给它;但将其第一位称为bit1.

因此,如果我们考虑您的代码:

struct value
{
    int bit1 : 1;
    int bit2 : 4;
    int bit3 : 4;
} bit;
Run Code Online (Sandbox Code Playgroud)

您要告诉编译器的是:取必要数量ints,并将块第 1 位称为bit1,然后将第 2-5 位称为bit2,然后将第 6-9 位称为bit3

由于所需的完整位数是 9 位,并且int是 32 位(在您的计算机体系结构中),因此只int需要1 个内存空间。因此你得到的大小为 4(字节)。

相反,如果您要定义structusing chars,因为它char是 8 位,编译器将为char每个 s分配两个s的内存空间struct value。您将获得 2(字节)作为输出。


oua*_*uah 5

因为 C 请求将位打包在同一单元中(这里是一个signed int/ unsigned int):

(C99, 6.7.2.1p10)“如果剩余足够的空间,紧跟在结构中另一个位域之后的位域应被打包到同一单元的相邻位中”