我知道这是愚蠢的,但我在编程世界中是一个安静的菜鸟,这是我的代码。
这个完美无缺:
#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”。谁能告诉我为什么?
答案 0 :(得分:9)
您将整数相乘,然后将结果放入浮点数。到那时,它已经溢出。
试试float x = 60.0f * 60.0f * 24.0f * 365.0f * 100.0f;
。你应该得到你想要的结果。
答案 1 :(得分:5)
60
是一个整数,24
,365
和100
也是一个整数。因此,整个表达式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-1
(2147483647
),因此这些值会溢出并变为-1141367296
,然后才会转换为浮点数。
尝试乘以浮点数而不是整数。