| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 583 人关注过本帖
标题:简单问一个问题 关于基础类型转换
只看楼主 加入收藏
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:9 
简单问一个问题 关于基础类型转换
4、下面的程序会输出什么?

123456789
#include <stdio.h>
int main()
  {   
     float a = 12.5;
     printf("%d\n", a);   
     printf("%d\n", (int)a);
     printf("%d\n", *(int *)&a);
     return 0;
   }
搜索更多相关主题的帖子: include return 
2014-09-02 21:28
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
收藏
得分:5 
放到IDE里编译运行一下嘛亲
2014-09-03 07:36
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:5 
估计考试会有这类题目 实际没啥意义

DO IT YOURSELF !
2014-09-03 11:06
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:0 
不需要给出精确答案 给出思路就可以
2014-09-03 11:27
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:0 
还是我说了答案吧
     float a = 12.5;
     printf("%d\n", a);    printf是不安全的这里会输出a的后半段字节去强行匹配 int型数据 结果大家可想而知
     printf("%d\n", (int)a);  这里进行了一次显示转换 能够正确的进行float转int
     printf("%d\n", *(int *)&a); 这里是用float型的前半段字节去强行匹配 int型数据  结果大家同样可想而知
2014-09-05 08:17
书生等待
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:280
专家分:689
注 册:2013-2-22
收藏
得分:0 
回复 5 楼 erty1001
楼主,我调试了下,你楼上说的也基本能懂,但是怎么得到这些结果的还是没想明白,楼主能否给出详细步骤

比如,a在内存中的存储bit,32bit具体为什么?
2014-09-05 09:51
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
收藏
得分:0 
楼主有心了,总是问一些有趣的问题


莫问前尘有愧,但求今生无悔
2014-09-05 09:52
书生等待
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:280
专家分:689
注 册:2013-2-22
收藏
得分:0 
我根据百度的,得到8.25在内存中存储是

0 1000 0010 100 1000 0000 0000 000 0000

不知道算错了没有,楼主帮解释下是怎么得到最后的结果嘞
还是压根不用知道8.25在内存中怎么存的呢?
2014-09-05 10:05
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:0 
但是怎么得到这些结果的还是没想明白,楼主能否给出详细步骤
简单说说:
对于16位环境 我们假设 int 数据是2字节,共2*8bit=16b   
int a表示为00000000 00000000
   最高位的0表示符号位   其余的零表示数据位
对于32位环境 我们假设 int 数据是4字节,共4*8bit=32b   
int a表示为00000000 00000000 00000000 00000000
最高位的0表示符号位   其余的零表示数据位

根据C标准,float 的字节数要不小于int,不管16位还是32位的环境,我们都可以假设是4,不同编译环境不大一样
float b表示为00000000 00000000 00000000 00000000
最高位的0表示符号位  蓝色的8个0表示指数部分   其余的零表示数据位
不管float如何表示实际的十进制数,
但是只要float32->int16
就会有截断误差,无非是数字取整转换,只取前16位截断,或只取后16位截断。

对于float32->int32情况来说
也有误差 体现在要不就是数字取整转换,要不就是硬取所有数字直接转换两种常见情况。自己体会吧


2014-09-05 10:12
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:0 
我根据百度的,得到8.25在内存中存储是

0 1000 0010 100 1000 0000 0000 000 0000

不知道算错了没有,楼主帮解释下是怎么得到最后的结果嘞
简单说说:既然你问 我也得根据IEEE标准算算
0 1000 0010 100 1000 0000 0000 000 0000
看来化解很清楚了 红色的0表示正数
蓝色1000 0010 表示字面指数是 128+2=130 实际为了表示float a=1E-56等数据
实际的指数应该是130再减去127(根据标准) 所以实际指数是130-127=3
字面的数据位是100 1000 0000 0000 000 0000
对于负数来说实际中最左边还默认存储一个1 正数就没有了
对于正数实际为0.100 1000 0000 0000 000 0000
然后指数为3 就是0.100 1000 0000 0000 000 0000 *2^3
小数点右移3次就可以
结果是100. 1000 0000 0000 000 0000
结果是 1*8+1*0.5=8.5 你的结果是8.25我得再研究
2014-09-05 10:20
快速回复:简单问一个问题 关于基础类型转换
数据加载中...
 
   



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

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