C 中从 Float 到 Int 的类型转换导致数字大相径庭,为什么?

Type-Casting in C from Float to Int results in wildly different number, why?

输入:

#include <stdio.h>
    #include <math.h>
    
    int main(void)
    {
        printf("%i", (int)pow(10,10));
        
        return 0;
    }

输出:

-2147483648

出于某种原因,pow() 导致 double 而不是 int 当我 运行 它(我使用 Pow() 因为由于某些原因,指数未编码为 C)。有什么原因吗?

一个 4 字节整数可以容纳的最大值在 -2,147,483,648 到 2,147,483,647 之间。 10^10 的结果是 10,000,000,000,超出了限制,转换溢出,产生了意想不到的结果。就这些了。

转换为 (int)pow(...) 是将 double 值转换为整数类型。 double 是 C 中可用的真实浮点类型之一。

浮点型转整数的规则可以参考in C11 draft 6.3.1.4p4, but on there is easier version on cppreference real floatinf-integer conversion:

A finite value of any real floating type can be implicitly converted to any integer type. Except where covered by boolean conversion above, the rules are:

The fractional part is discarded (truncated towards zero). 
  • If the resulting value can be represented by the target type, that value is used
  • otherwise, the behavior is undefined

假设您有一个健全的平台,您的 sizeof(int) 是 4 和 INT_MAX=2147483647pow(10, 10) 的结果是 (double)10000000000.0,它的小数部分在目标整数类型 (int) 中不可表示。您的代码的行为只是 undefined.