在这段代码中
#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
编译器中,默认情况下 integer
是 short
整数,其大小为 2 字节(16 位)
。
接下来来到sizeof
,您正在尝试打印sizeof结构,这不是所有数据成员的sizeof总和
。
struct bits
的第一个成员是unsigned a : 5
,当编译器第一次看到unsigned
时,它分配2个字节或 16 位
为此,在 16 位中
您仅使用5 位
,即您仍然可以存储11 位
。
下一个成员是unsigned b:5
,它将在相同的先前内存
中提供,因此大小仍然是2字节
。到目前为止,内存分配看起来像
----------------------------------------------------------------------
| 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 位,现在 16 位
中有多少个待处理的位? 6 位
对吗?您可以在剩余的6位
中存储一个char(8位)
吗?答案是否
。因此,剩余的6位将是结构中的漏洞
(我显示的是p
,它是填充
)
接下来对于char c
它将再次分配单独的1字节
,所以到目前为止2+1 = 3字节
。
结构的下一个成员是d
,它也是整数,因此为此2字节
将被分配。因此,将为整个结构分配总共 2+1+ 2 = 5 字节
。
我希望你明白了。
关于c - C语言编程中的位域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47856934/