| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1332 人关注过本帖, 1 人收藏
标题:[求助]共用体问题
只看楼主 加入收藏
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏(1)
 问题点数:0 回复次数:8 
[求助]共用体问题

已知字符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);}

请高手帮忙解下該題,并写出详细过程,谢谢!

搜索更多相关主题的帖子: 十六进制 
2004-06-14 16:09
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 

没人帮忙,真晕


2004-06-15 16:47
zff_ff
Rank: 1
等 级:新手上路
帖 子:147
专家分:0
注 册:2004-5-12
收藏
得分:0 

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编辑过]


偶是一只想要飞却忘了咋飞的菜鸟
2004-06-15 19:10
jzh2004
Rank: 1
等 级:新手上路
帖 子:341
专家分:0
注 册:2004-4-30
收藏
得分:0 
他输出的是整形,所以我认为应该是57

我的主页 http://www.
2004-06-15 22:29
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 

结果是57,再我不知道怎么来的,能不能解释一下啊?


2004-06-16 16:13
zff_ff
Rank: 1
等 级:新手上路
帖 子:147
专家分:0
注 册:2004-5-12
收藏
得分:0 

其实这题输出是什么没有什么意义的

printf("%d\n",z.c);

在有的编译器里会将z.c强制转换为int里

而有的则不会,输出仍是char型

我一直认为这是你的笔误罢了

至于输出57也好还是输出9,只要你明白原因就行了

两种情况我都说过,这里就不重复了


偶是一只想要飞却忘了咋飞的菜鸟
2004-06-16 19:07
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 

这个程序不是我写的,是试卷上面的,

试卷配了答案,我只知道答案,不知道怎么来的,所以问问大家,

但到现在为止,我还是不知道答案是怎么来的!


2004-06-19 19:45
jzh2004
Rank: 1
等 级:新手上路
帖 子:341
专家分:0
注 册:2004-4-30
收藏
得分:0 

共用体是共用存储单元的,象你上面定义的共用体共定义了一个字符型,一个大小为4的无符号整形数组

共用体共占了8个字节内存,字符和数组的起始地址是一样的,

并且一般计算机的内存的存放顺序是低位的存在低地址,也就是z.i[0]=0x39中的39存放在共用体的首个字节中

而共用体中的字符型也指向第一个字节,所以printf("%d\n",z.c);该语句输出的是共用体第一个字节中的内容,

并且因为他是整形输出,所以输出16进制39的十进制数为57


我的主页 http://www.
2004-06-19 21:45
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
明白了,谢谢版主!

2004-06-20 10:19
快速回复:[求助]共用体问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028641 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved