谁能告诉我为什么浮动不能持有3153600000?

时间:2011-04-27 22:59:47

标签: c++ c overflow

我知道这是愚蠢的,但我在编程世界中是一个安静的菜鸟,这是我的代码。

这个完美无缺:

#include <stdio.h>

int main() {

    float x = 3153600000 ;

    printf("%f", x);

    return 0;
}

但是这个有一个问题:

#include <stdio.h>

int main() {

    float x = 60 * 60 * 24 * 365 * 100 ;

    printf("%f", x);

    return 0;
} 

所以60 * 60 * 24 * 365 * 100是3153600000吧???如果是,那为什么会产生不同的结果?我得到了第二个溢出的溢出,结果是“-1141367296.000000”。谁能告诉我为什么?

4 个答案:

答案 0 :(得分:9)

您将整数相乘,然后将结果放入浮点数。到那时,它已经溢出。

试试float x = 60.0f * 60.0f * 24.0f * 365.0f * 100.0f;。你应该得到你想要的结果。

答案 1 :(得分:5)

60是一个整数,24365100也是一个整数。因此,整个表达式60 * 60 * 24 * 365 * 100是使用整数运算执行的(编译器在查看表达式之前评估表达式)。

在典型的32位架构中,有符号整数最多只能保存2,147,483,647的值。因此,在将值分配到float变量之前,该值将被截断为32位

如果告诉编译器使用浮点运算,例如通过将f添加到第一个值以使其浮动,然后您将获得预期的结果。 (一个浮点乘以一个int是一个浮点数,因此浮点数传播到整个表达式。)例如:

float x = 60f * 60 * 24 * 365 * 100;

答案 2 :(得分:2)

你的编译器不会吐出这个警告吗?我的确:

  

警告:整数溢出   表达

溢出发生在全整数表达式转换为浮点数之前,然后存储在x中。向表达式中的所有数字添加.0f以使它们浮动。

答案 3 :(得分:1)

如果乘以两个整数,结果也将是一个整数。

60 * 60 * 24 * 365 * 100是一个整数。

由于整数最多可达2^31-12147483647),因此这些值会溢出并变为-1141367296,然后才会转换为浮点数。

尝试乘以浮点数而不是整数。