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

atm*_*506 3 c c++ overflow

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

这个完美的工作:

#include <stdio.h>

int main() {

    float x = 3153600000 ;

    printf("%f", x);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是这个有一个问题:

#include <stdio.h>

int main() {

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

    printf("%f", x);

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

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

joc*_*oce 9

你是乘以整数,然后将结果放在一个浮点数.到那时,它已经溢出.

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


Joe*_*ite 5

60是整数,因为是24,365,和100.因此,整个表达式60 * 60 * 24 * 365 * 100使用整数运算执行(编译器在查看表达式的变量之前评估表达式).

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

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

float x = 60f * 60 * 24 * 365 * 100;
Run Code Online (Sandbox Code Playgroud)