免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3534 | 回复: 7
打印 上一主题 下一主题

[C] GCC编译器,将double转换为float为什么不产生告警? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-21 12:43 |只看该作者 |倒序浏览
各位大侠,小弟在写一个程序时有一个疑问:GCC为什么不会对double赋值给float型变量产生告警?VC上则会告警,我的系统是Ubuntu 12.0,
程序如下:


ncludei<stdio.h>

int main()
{
    int lowest = 0;
    int uppest = 300;
    int step = 20;
    int fahr = lowest;
    float celsius;

    while(fahr <= uppest)
    {
        celsius = 5.0 / 9 * (fahr - 32);
        printf("fahr = %d\tcelsius=%f\n", fahr, celsius);
        fahr += step;
    }
    printf("sizeof(float)= %d,\tsizeof(double)= %d, sizeof(long double)= %d\n", sizeof(float), sizeof(double), sizeof(long double));
    return 0;
}

编译时没有产生告警,我预期是在  celsius = 5.0 / 9 * (fahr - 32);产生告警的。另外 printf("sizeof(float)= %d,\tsizeof(double)= %d, sizeof(long double)= %d\n", sizeof(float), sizeof(double), sizeof(long double));输出的结果如下:sizeof(float)= 4,       sizeof(double)= 8,       sizeof(long double)= 12


请大神指点,多谢~

论坛徽章:
0
2 [报告]
发表于 2013-07-21 12:45 |只看该作者
小弟在线等,求大神指点~

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
3 [报告]
发表于 2013-07-21 15:30 |只看该作者
-Wall

论坛徽章:
0
4 [报告]
发表于 2013-07-21 16:44 |只看该作者
回复 3# fender0107401


加上-Wall,依旧没有任何waring


   

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
5 [报告]
发表于 2013-07-21 16:53 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2013-07-21 19:15 |只看该作者
回复 5# pmerofc


    多谢哈

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
7 [报告]
发表于 2013-07-21 22:31 |只看该作者
回复 1# yl130029


    VC默认启用了/fp:precise 选项,这个不属于标准规定的行为,算是VC++自己的扩展。这个选项“在 x86 处理器上使用 /fp:precise 时,编译器将对浮点类型的变量执行舍入,使其达到赋值、强制转换以及将参数传递给函数时所需的适当精度“,可见这个选项使用的浮点处理规则由运行时提前到编译期,所以你遇到警告应该和这个相关。改更其它选项或禁用此功能应该就没这个选项了。具体可参考:http://msdn.microsoft.com/zh-cn/library/vstudio/e7s85ffb.aspx

论坛徽章:
0
8 [报告]
发表于 2013-07-22 17:36 |只看该作者

首先,double 和 float 数据类型,C99标准只是规定了他们的范围吧。有两种情况, double 范围 必须 > float 范围。 第二种, double 范围 必须 >= float 范围

我没查过具体标准,以我的估计 第二种可能性很大。有点类似   sizeof(long) >= sizeof(int)

假如是第二种情况,在具体实现上,double 就有可能 = float。  所以,C99之类的标准是不会要求编译器告警的。

具体实现告警肯定是编译器自己的事情。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP