| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 862 人关注过本帖
标题:一个很简单的共用体类型的代码,但我不知道其中一点
只看楼主 加入收藏
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
结帖率:100%
收藏
 问题点数:0 回复次数:10 
一个很简单的共用体类型的代码,但我不知道其中一点
下面是一个很简单的代码:
#include<stdio.h>
union DATA
  {
    int i;
    float b;
    char c;
    };
union DATA a;
void main()
{
   a.i=97;
   printf("浮点数:%f",a.b);
   printf("字符:%c",a.c);
}
这里的代码很容易理解的,但有一个地方(加颜色的部分)我不是很明白,在函数中,我对i赋值为97,然后想输出浮点数b,我以为输出的会是97.000000,但实际上却是0.000000,为什么会这样?能帮我具体解释一下吗?而且无论对i赋任何值,输出的浮点数b都是0.000000,何解?
2012-12-16 12:00
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
主要原因是float 和int 的内存组织结构不一样。。
你查询float 的内存结构就知道了

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-16 12:01
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
float
符号        指数         尾数
0           00000000     000000000000000000000000


而int
符号         数据
0           0000000000000000000000000000000
0正1负


不可以直接把联合体中不可以把int作为float输出。

至于你说“无论对i赋任何值,输出的浮点数b都是0.000000”,主要就是你给他赋值的数对于float的内存排布都是在float精度之下而已。
推荐你看《c++ 反汇编与逆向分析》 有一张专门说数据类型的,说的很好








我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-16 12:18
枫叶飘落
Rank: 2
等 级:论坛游民
帖 子:35
专家分:66
注 册:2012-10-27
收藏
得分:0 
二楼能不能举个例子
2012-12-16 12:23
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
97 的四个字节二进制码:00000000 00000000 00000000 01100001
对于float来说也就是
0      00000000 000000000000000001100001
符号   指数      尾数
指数 00000000 - 127(这个是十进制码,至于为什么要-127 ,看书去咯) = 10000001
尾数部分,000000000000000001100001,也就是二进制码的 1.00000000000000001100001(注意这个是二进制码的小数)
也就是
1.00000000000000001100001(这个要转成十进制) * (10^-127)

你说 1.几乘以一个10^-127 是不是0 ?

印象中是这样解码,大概就是这样,再要求问细,看书去咯,^_^

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-16 12:40
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
谢谢你们,我先去研究一番

思考赐予新生,时间在于定义
2012-12-16 12:45
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
不过,去哪里看那本《c++ 反汇编与逆向分析》,百度找不到,能推荐一个下载网站给我吗?最好是pdf格式的

思考赐予新生,时间在于定义
2012-12-16 12:51
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
我只是买了书的,这类型书都是有点贵,
用google吧,能搜出很多,估计你用百度搜不出来?

csdn上有人共享。。如果你找不到,吧邮件发给我,我给你发一份

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-16 13:18
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
回复 7楼 love云彩
不过,如果你还是刚刚开始学c的,就没有必要看这本书了,先打好基础在说,内存排布的,了解下就行了,没有必要研究太深入。

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-16 13:19
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
哦,原来如此,不过还真被你说对了,我是刚接触C语言的,不过,…………,我们还是QQ-938517458聊吧,我想认识你

思考赐予新生,时间在于定义
2012-12-16 13:57
快速回复:一个很简单的共用体类型的代码,但我不知道其中一点
数据加载中...
 
   



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

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