这里我有一段代码片段。
#include <stdio.h>
int main()
{
struct value
{
int bit1 : 1;
int bit2 : 4;
int bit3 : 4;
} bit;
printf("%d",sizeof(bit));
return 0;
}
我输出为4(32位编译器)。 谁能解释我怎么样?为什么不是1 + 4 + 4 = 9? 我之前从未使用过bit字段,所以会喜欢一些帮助。谢谢。 :)
答案 0 :(得分:4)
因为C请求将这些位打包在同一个单元中(此处为signed int
/ unsigned int
):
(C99,6.7.2.1p10)“如果剩余足够的空间,则紧跟在结构中另一个位域之后的位域应被打包到同一单元的相邻位中”
答案 1 :(得分:4)
当你告诉C编译器时:
int bit1 : 1
它将其解释为并为其分配一个整数;但是它的第一位是bit1
。
因此,如果我们考虑您的代码:
struct value
{
int bit1 : 1;
int bit2 : 4;
int bit3 : 4;
} bit;
你告诉编译器是这样的:取int
的必要数,并将块1称为bit1
,然后参考位2 - 5为bit2
,然后将第6 - 9位称为bit3
。
由于所需的完整位数为9,而int
为32位(在计算机的架构中),因此只需要1 int
的内存空间。因此,您将获得4(字节)的大小。
相反,如果您使用struct
定义char
,因为char
是8位,编译器将分配两个char
的内存空间每个struct value
。你将获得2(字节)作为输出。
答案 2 :(得分:-1)
处理器只喜欢一次性吸收大约32位 - 而不是9,34等。
它只是将其归结为处理器所喜欢的内容。 (让工人高兴)