Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言编程中的位域_C_Structure_Bit Fields - Fatal编程技术网

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段)明确告诉我们:“位字段和相邻的非位字段成员位于单独的内存位置。”