这里是这段代码
#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 bytes(16 bits)
。
接下来来sizeof
,你正在尝试打印sizeof结构,这是什么sum of sizeof all data member
。
struct bits
的第一个成员是unsigned b : 5
,当编译器首先看到unsigned
它为此分配2 bytes or 16 bits
,out 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.
如果你分析上面的数字,前5位为a,接下来5位为b,现在有多少未决的16 bits
? 6 bits
对吗?你可以在剩下的char(8 bit)
存储6 bits
,答案是No
。所以剩下的6 bits will be holes in structure
(我展示的是p
,这是padding
)
所以接下来对于char c
它将再次分配单独的1 bytes
,所以直到现在2+1 = 3 bytes
。
结构的下一个成员是d
,它也是整数,所以为此,将分配2 byte
s。所以总的2+1+ 2 = 5 bytes
将分配给整个结构。
我希望你明白了。