C编程中的位域

bit fields in c programming

在此代码中

#include<stdio.h>
void main()
{
    struct bits{
        unsigned a:5;
        unsigned b:5;
        char c;
        int d;
    } bit1;

    printf("%d",sizeof(bit1));
}

输出是5
请解释5是怎么来的

您似乎正在使用 Turbo C(windows)。在 TurboC 编译器中,默认情况下 integershort 整数,即 2 bytes(16 bits).

接下来是 sizeof,您正在尝试打印 sizeof 结构,这没什么 sum of sizeof all data member

struct bits 的第一个成员是 unsigned a : 5,当编译器首先看到 unsigned 时,它为此分配了 2 bytes or 16 bitsout of 16 bits 你正在使用只有 5 bits 即你仍然可以存储 11 bits.

下一位成员是 unsigned b:5,这将在 same previous memory 后送达,所以仍然是 2 bytes。到目前为止内存分配看起来像

----------------------------------------------------------------------
|   p |   p |   p | p | p | p | b | b | b | b | b | a | a | a | a | a |
----------------------------------------------------------------------
0x115 0x114 0x113..         ........                               0x100
MSB                                                                LSB 
a means for a 5 bits
b means for b 5 bits
p means padding or wastage.

如果你分析上图,a的前5位b的后5位,现在有多少pending out 16 bits6 bits 对吗?你能不能在剩余的 6 bits 中存储一个 char(8 bit),答案是 No。所以剩下的 6 bits will be holes in structure(我显示的是 ppadding

所以接下来 char c 它将再次分配单独的 1 bytes,所以到现在为止 2+1 = 3 bytes.

结构的下一个成员是 d,它也是整数,因此将为此分配 2 bytes。所以总共 2+1+ 2 = 5 bytes 将分配给整个结构。

我希望你明白了。