位域中不可预知的答案
你能否解释一下为什么这段代码的输出是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
结构bitfield
将a
, c
和b
打包成单个无符号整数。 无符号整数的大小为4字节 。