c - GCC编译时分错误

标签 c gcc compiler-construction

有人可以解释这种行为吗?

测试.c:

#include <stdio.h>

int main(void)
{
    printf("%d, %d\n", (int) (300.6000/0.05000), (int) (300.65000/0.05000));
    printf("%f, %f\n", (300.6000/0.05000), (300.65000/0.05000));
    return 0;
}

$ gcc 测试.c

$ ./a.out
6012, 6012
6012.000000, 6013.000000

我检查了汇编代码,它把第一个 printf 的两个参数都作为 6012,所以这似乎是一个编译时错误。

最佳答案

运行

#include <stdio.h>

int main(void)
{
    printf("%d, %d\n", (int) (300.6000/0.05000), (int) (300.65000/0.05000));
    printf("%.20f %.20f\n", (300.6000/0.05000), (300.65000/0.05000));
    return 0;
}

而且应该更清楚。第二个值(在浮点除法之后,不精确)是 ~6012.9999999999991,所以当你用 (int) 截断它时,gcc 足够聪明,可以在编译时输入 6012。

当您打印 float 时,默认情况下 printf 将它们格式化为仅以 6 位精度显示,这意味着第二个打印为 6013.000000。

关于c - GCC编译时分错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2963335/

相关文章:

C++:编译器和链接器功能

java - 快速修复字符串开关后的 Android 错误

c - 内存分配如何在极端情况下工作?

c - 向函数传递指针的问题

c - 毕达哥拉斯三元组,不全等

c - 查找 popen 输出更改

c++ - undefined reference 错误,即使在链接 c 文件之后

c++ - 是否有 GCcflags发出有关作用域内相同变量重新定义的警告?

gcc - 创建自定义 gcc 属性以检测特定函数 : whitelisting, 未列入黑名单

javascript - 谷歌闭包编译器 - 双重编译