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=2147483647
。 pow(10, 10)
的结果是 (double)10000000000.0
,它的小数部分在目标整数类型 (int)
中不可表示。您的代码的行为只是 undefined.
输入:
#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=2147483647
。 pow(10, 10)
的结果是 (double)10000000000.0
,它的小数部分在目标整数类型 (int)
中不可表示。您的代码的行为只是 undefined.