求高手来帮我看看这个C代码

来源:百度知道 编辑:UC知道 时间:2024/06/03 12:49:25
#include "stdio.h"
#include "stdlib.h"
#define AB(X)printf((X)?"1":"0")
#define UI unsigned int
struct byte
{UI a0:1;UI a1:1;UI a2:1;UI a3:1;UI a4:1;UI a5;UI a6;UI a7;};
union bits{char ch;struct byte bit;};
void decode (union bits c);
void main()
{
char c;union bits asc;
for(c='A';c<'C';c++)
{asc.ch=c;printf("%o:",c);decode(asc);}
system("pause");
}
void decode(union bits b)
{
AB(b.bit.a7);
AB(b.bit.a6);
AB(b.bit.a5);
AB(b.bit.a4);
AB(b.bit.a3);
AB(b.bit.a2);
AB(b.bit.a1);
AB(b.bit.a0);
printf("\n");
}
输出是:
101:11100001
102:11100010
哪个高手能帮我分析一下为啥是这个结果啊???
问题就是为啥a0会等于1,我觉得a0到a4都是0

相关知识点:位域,联合

位域 参考百度百科:http://baike.baidu.com/view/1256879.htm
联合(union) 参考百度百科:
http://baike.baidu.com/view/885869.htm

struct byte是个有位域的结构体内存分布为:
a0 1位(低位)
a1 1位
a2 1位
a3 1位
a4 1位
空闲27位(32-5)
a5 32位
a6 32位
a7 32位

联合是公用内存的 内存大小为占用空间最大的成员所占的空间.其成员为
char ch;
struct byte bit;
因此分配为struct byte所占的空间即32*4=128位

for(c='A';c<'C';c++) 说明是A和B两个字母

printf("%o:",c);%o是以八进制输出
A的八进制为101 (16进制为41) (2进制0100 0001)
B的八进制为102 (16进制为42) (2进制0100 0010)

执行union bits asc;后
asc分配了随机数

字母A时:

执行asc.ch=c;后
由于是ch和bit共用内存
asc的内存分配就为
A(8位 其中有a0=1 a1=0 a2=0 a3=0 a4=0 其余三位(010空闲)) 随机数(24位)(空闲)
a5随机数(32位)
a6随