为什么这段代码在结构中包含冒号?

Why does this code contains colon in struct?

请解释这段代码是怎样的executing.why我们在structures.what中使用了“:”是在structures.what中使用冒号structures.what应该是sizeof运算符的输出。

#include <stdio.h>
int main()
{
struct bitfield {
    signed int a : 3;
    unsigned int b : 13;
    unsigned int c : 1;
};
struct bitfield bit1 = { 2, 14, 1 };
printf("%ld", sizeof(bit1));
return 0;
}

它是 bit fields 语法的一部分。 这里表示a占3位,b占13位,c只占1位。 当然,该结构不会只占用内存中的 17 位,因为它必须对齐字节作为最小的可寻址内存单元,因此 sizeof(bit1) 将至少为 3 个字节(可能它会对齐到与一个机器字,例如 4 个字节)。 您可以在此处阅读有关对齐的更多信息:Structure padding and packing。 我假设 1 个字节是 8 位大小,但有一些旧的或异国情调的体系结构,其中字节具有其他大小。

: 运算符用于 bit fields,即使用较大 space 的指定位数的整数值。这些可能会打包成机器字以保存 space,但实际行为是实现定义的。

现在,问题 "what should be the output of the sizeof operator" 很简单,但答案很复杂。

sizeof operator说的是returns字节数,但是"bytes"的定义不一定是你想的那样。一个字节必须至少为 8 位,但可以多于 8 位。 9、12、16位不是闻所未闻

给定平台的

sizeof(int) 可能因架构字长而异。假设字节大小为 8 位,sizeof(int) 可能是 2、4 或 8。可能更多。字节大小为 16,sizeof(int) 实际上可能是 1。

现在,还记得我说过位域是否打包取决于实现吗?好吧,这将在这里产生很大的不同。每个位域都可以放入一个单独的字中。或者它们都可以打包成一个。

很可能,您使用的是 8 位字节和 32 位或 64 位 ints 的 Intel 平台,并且编译器可能会打包位字段。因此,您的 sizeof(bit1) 很可能是 4 或 8。