为什么浮点数不会溢出到无穷大

amj*_*jad 2 c floating-point

假设我们有以下代码:

float f = 999999999999*9999999999999999*999999999999; //a large number to make it overflow
Run Code Online (Sandbox Code Playgroud)

所以根据浮点规则,结果应该是无穷大: 在此处输入图片说明

但是我检查了结果的位表示,它不是无穷大,它是别的,怎么会?

Kev*_*vin 9

中的值999999999999*9999999999999999*999999999999都不是浮点数,因此您没有进行浮点运算。事实上,即使没有设置任何额外的警告选项,gcc 也会为您的代码提供此警告(clang 给出了类似的警告):

warning: integer overflow in expression of type 'long int' results in '4467987020393345025' [-Woverflow]
Run Code Online (Sandbox Code Playgroud)

改为这样做

float f = 999999999999.0f*9999999999999999*999999999999;
printf("%f\n", f);
Run Code Online (Sandbox Code Playgroud)

输出:

inf
Run Code Online (Sandbox Code Playgroud)

使第一个文字成为浮点数会强制进行浮点运算,因此您可以获得所需的无限值。