已知字符0的ASCII码为十六进制的30
main()
{int i;
union {unsigned char c;unsigned int i[4];}z;
z.i[0]=0x39;z.i[1]=0x36;
printf("%d\n",z.c);}
请高手帮忙解下該題,并写出详细过程,谢谢!
没人帮忙,真晕
union和struct一个很重要的区别在与union里的成员是共用一个地址的
在本题里z.c的地址和z.i[0]是一样的
所以在执行z.i[0]=0x39;时z.c的值就为111001,
如果c是int型的,那么值应该为57(二进制转换为10进制我就不说明了)
但是在这里c是char型的
那么111001就要按照ASCII进行转换
结果应该是9(0的ASCII是30)
[此贴子已经被作者于2004-06-15 19:28:13编辑过]
结果是57,再我不知道怎么来的,能不能解释一下啊?
其实这题输出是什么没有什么意义的
printf("%d\n",z.c);
在有的编译器里会将z.c强制转换为int里
而有的则不会,输出仍是char型
我一直认为这是你的笔误罢了
至于输出57也好还是输出9,只要你明白原因就行了
两种情况我都说过,这里就不重复了
这个程序不是我写的,是试卷上面的,
试卷配了答案,我只知道答案,不知道怎么来的,所以问问大家,
但到现在为止,我还是不知道答案是怎么来的!
共用体是共用存储单元的,象你上面定义的共用体共定义了一个字符型,一个大小为4的无符号整形数组
共用体共占了8个字节内存,字符和数组的起始地址是一样的,
并且一般计算机的内存的存放顺序是低位的存在低地址,也就是z.i[0]=0x39中的39存放在共用体的首个字节中
而共用体中的字符型也指向第一个字节,所以printf("%d\n",z.c);该语句输出的是共用体第一个字节中的内容,
并且因为他是整形输出,所以输出16进制39的十进制数为57