#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.你能解释一下它在内部是如何工作的吗?
答案 0 :(得分:1)
编译器决定在单个int
中布置位域,在您的平台上为32位。这意味着整个结构需要32位,即使结构的可用部分较小。
大多数机器都不是位可寻址的,因此它实际上无法创建9位宽的对象。它本可以选择16位,你可以用一些#pragma
或attribute
魔法来说服它。 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;