请帮我解决下面与代码片段相关的逻辑。我得到的输出是12 8
。 *p
为什么是12?
我知道它的大小是8,但是我对*p
显示的值感到不安。
int main()
{
struct bitfield
{
unsigned a:5;
unsigned c:5;
unsigned b:6;
} bit;
char *p;
struct bitfield bit1={1,3,3};
p=(char*)&bit1;
p++;
printf("%d\t%d",*p,sizeof(bit1));
getchar();
return 0;
}
最佳答案
首先,
因为声明
struct bitfield
{
unsigned a:5;
unsigned c:5;
unsigned b:6;
}bit;
您的位字段
bit
将具有16位的位字段,其排列方式如下00000000 00000000
ccccccbb bbbaaaaa
其次,由于输入为{1,3,3},因此将1分配给a,3到b,将另一个3分配给c,使它变成这样
00001100 01100001
ccccccbb bbbaaaaa
第三,因为p只是字符指针,所以它最初将使用两个字节中的最后一个字节(8位),该地址的地址采用小尾数格式(编辑:尽管实现/与平台相关,请参见注释和另一个答案)抽象),因此,p指向
01100001
bbbaaaaa
但是第四,您增加了p!因此,以小端序格式,它现在指向
00001100
ccccccbb
最后,打印出p所指向的值。显然,00001100就是十进制值12的位表示形式。这就是为什么得到12的原因。
关于c - 具有无符号变量的结构位字段的C代码段行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34372783/