| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5906 人关注过本帖, 1 人收藏
标题:整型与浮点型数据运算结果为什么是0?
取消只看楼主 加入收藏
chamlien
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-12-27
结帖率:100%
收藏(1)
已结贴  问题点数:5 回复次数:8 
整型与浮点型数据运算结果为什么是0?
# include <stdio.h>

int main(void)

{
    float sum = 0;
    int i = 1;
    printf("%f\n", 1/i); //此时输出的值为0,为啥?
    printf("%d\n",sum+i);  //此时输出的值为0,为啥?

    for (i=1; i<=100; i++)
    {
        // sum = sum + 1/i; //最终sum为0,为啥;
        sum = sum + (float)(1/i); // 此处虽然进行了强制类型转换,但是sum的值还是为0,为啥?
    }
    printf("%d\n", sum);
    return 0;
}
搜索更多相关主题的帖子: include 
2015-09-04 22:00
chamlien
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-12-27
收藏
得分:0 
回复 2楼 林月儿
因为是在跟着郝斌老师的视频学,里面没怎么讲解,遇到了也想不通,就上来问各位大神了
2015-09-04 22:15
chamlien
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-12-27
收藏
得分:0 
回复 3楼 TonyDeng
(float)(1/i);首先 (1/i)得出的是整型结果,此时float不能对其强制转换;
而 1/(float)(i), 强制转换了i为float型,也即是说强制转换不能对常量而是对变量?
2015-09-04 22:19
chamlien
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-12-27
收藏
得分:0 
回复 5楼 林月儿
有入门书籍推荐吗?
2015-09-04 22:20
chamlien
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-12-27
收藏
得分:0 
以下是引用林月儿在2015-9-4 22:25:01的发言:




什么呀,1/i不就是0么而且是整型的,上转型也不用强转。。。

入门级的书只要不乱写没什么限制,后期可以有选择的看


1/i 不是1吗? 1是整型,i = 1; 也是整型,1/i 不是为1吗? printf("%d", 1/i);值为1,而printf("%f", 1/i)值为0,何解呢?
2015-09-04 22:31
chamlien
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-12-27
收藏
得分:0 
以下是引用林月儿在2015-9-4 22:36:44的发言:

说漏了,下面的循环,当i>1,1/i为0


    先不用说下面的循环,就这三行代码,值不同
    int i = 1;
    printf("%f\n", 1/i); //此时输出的值为0,为啥?
    printf("%d\n", 1/i); //此时输出的值为1,这个很好理解
2015-09-04 22:40
chamlien
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-12-27
收藏
得分:0 
以下是引用林月儿在2015-9-4 22:52:02的发言:

printf("%f\n", 1/i); //此时输出的值为0,为啥?
你确定是0?我很少看C代码的不要骗我。。。输出语句都是java看的多
System.out.printf("%f\n", 1/1);
应该没你说的那样吧


C里输出的值是0.000000
2015-09-04 22:55
chamlien
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-12-27
收藏
得分:0 
以下是引用vvvcuu在2015-9-4 23:29:48的发言:

先了解一下整型数据和浮点型数据在内存中的存储方式再来考虑这个问题吧.  强制类型转换仅仅在变量参与运算的那一刻起作用, 并不改变变量原来的类型和数值.

可以试着运行以下代码看看与你自己想想的结果是否一样:

# include <stdio.h>

int main(void)

{
  int a=30;
  float b=3.0;
  float c=0.00000003;
  float d=123456789.0;
  printf("%f\n%d\n%d\n%d\n",a,b,c,d);
  return 0;
}

是不是与自己想的答案有出入?
整型数据1在内存中是这样存储的00000000 00000000 00000000 00000001      //实际是连续的,这里为了方便观察,8位一组加空格了
//当然实际可能还设计补码,移码,反码之类的东西,详细讨论没有益处, 按照原码来理解更方便一些.



如果这个数字表述浮点数的话,那么就麻烦了, 除了一位符号位,8位阶码(指数),还有23位,这23位都在小数点后面啊, 算一下这个数字换成10进制成了多少?

2^(-23)

这个数字直接输出,对于只有6位有效数字的float实在是力不从心.所以它只好给你7个0了.


例子举得很到位,以上的值输出确实不同,不过自己的基础还没打好,先留着消化几天
2015-09-04 23:36
chamlien
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-12-27
收藏
得分:0 
一个小贴引发大神讨论,学习了!
2015-09-06 22:16
快速回复:整型与浮点型数据运算结果为什么是0?
数据加载中...
 
   



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

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