c语言编程中的位域
在此代码中c语言编程中的位域,c,structure,bit-fields,C,Structure,Bit Fields,在此代码中 #include<stdio.h> void main() { struct bits{ unsigned a:5; unsigned b:5; char c; int d; } bit1; printf("%d",sizeof(bit1)); } #包括 void main() { 结构位{ 未签名a:5; 未签名的b:5; 字符c; int d; }比特1; printf(“%
#include<stdio.h>
void main()
{
struct bits{
unsigned a:5;
unsigned b:5;
char c;
int d;
} bit1;
printf("%d",sizeof(bit1));
}
#包括
void main()
{
结构位{
未签名a:5;
未签名的b:5;
字符c;
int d;
}比特1;
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个比特
下一个成员是未签名的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.
如果您分析上图,前5位为a,后5位为b,现在在16位中有多少位待处理<代码>6位
对吗?您能否将字符(8位)
存储在剩余的6位
中,答案是否
。所以剩余的6位将是结构中的孔
(我显示的是p
,它是填充
)
因此,接下来对于charc
它将再次分配单独的1字节
,因此到目前为止2+1=3字节
结构的下一个成员是d
,它又是整数,因此为此2字节
s将被分配。因此,将为整个结构分配总计2+1+2=5个字节
我希望你明白了 我想知道我所期望的5是如何存储在一个单独的对象中的,这不是因为它需要的8位不适合分配给a
和b
的字节中剩余的位,而是因为它是一个常规对象,而不是一个位字段,因此,它是单独存储的。这是根据C 2011的6.2.6.1,但第3.14条的注释2(第3段)明确告诉我们:“位字段和相邻的非位字段成员位于单独的内存位置。”