位域中不可预知的答案

你能否解释一下为什么这段代码的输出是12(1100b)

以及sizeof(bit1)如何是4byte ???

#include  #include  struct bitfield { unsigned a:5; unsigned c:5; unsigned b:6; }; void main() { char *p; struct bitfield bit1={1,3,3}; //a=00001 ,c=00011 ,b=000011 p=&bit1; // p get the address of bit1 p++; // incriment the address of p in 1 printf("%d\n",*p); printf("%d\n",sizeof(bit1)); } 

您已将位字段声明为unsigned 。 在大多数现代系统中,这是一个32位整数。 (unsigned short是16,char 8,long 64等)所以,你要声明一个32位的bitfield容器。 每个单独位字段参数的大小由位域名称后面的整数给出,但它们打包的容器大小是指定数据类型的倍数…通常是指示的总位数的最小倍数适应 – 虽然词边界和其他事情将发挥作用。

我很惊讶其余任何一部分都有效。 除了指针中的转换问题外,printf还打印整个字段的前8位……一个字符。 这不会破坏位字段本身,而是在字节/字符存储器边界上。 根据您的系统是大端还是小端,它将是整个字段的MSB或LSB。

指针p包含结构变量bit1的地址。

我相信你的系统只有很少的字节序寻址,因为变量b放在指针p指向的位置,* p打印bit1的前两个字节的内容。

在你的情况下b=3 (000011)

但这两个字节包含,

 00000000 00001100 (12) ------ ^ | Value of b 

为了更好地理解这个,

b的值更改为5(000101),如下所示,

 struct bitfield bit1={1,1,5}; 

然后你的输出将是20,因为,

 00000000 00010100 (20) ------ ^ | Value of b 

结构bitfieldacb打包成单个无符号整数。 无符号整数的大小为4字节