请您解释一下为什么此代码的输出为12(1100b)
以及sizeof(第1位)是4字节???
#include <stdio.h>
#include <stdlib.h>
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));
}
答案 0 :(得分:2)
您已将位字段声明为unsigned
。在大多数现代系统中,这是一个32位整数。 (unsigned short是16,char 8,long 64等)所以,你要声明一个32位的bitfield容器。每个单独位字段参数的大小由位域名称后面的整数给出,但是它们打包的容器大小是指定数据类型的倍数...通常是指示的总位数的最小倍数适应 - 虽然词边界和其他东西将发挥作用。
我很惊讶其余部分都有效。除了指针中的转换问题外,printf还打印整个字段的前8位......一个字符。这不会破坏位字段本身,而是在字节/字符存储器边界上。根据您的系统是大端还是小端,它将是整个字段的MSB或LSB。
答案 1 :(得分:1)
指针p
包含结构变量bit1
的地址。
我相信你的系统正在进行 little endian 寻址,因为变量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字节。