[英]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;
}
OUTPUT:
-2147483648
出于某种原因,当我运行pow()
时,它会产生一个double
而不是int
(我使用Pow()
,因为由于某种原因,指数没有被编码到 C 中)。 有什么理由吗?
转换为(int)pow(...)
正在将double
精度值转换为 integer 类型。 double
是 C 中可用的真正浮点类型之一。
关于将浮点类型转换为 integer 的规则可以在 C11 草案 6.3.1.4p4中找到,但在cppreference real floatinf-integer 转换上有更简单的版本:
任何实浮点类型的有限值都可以隐式转换为任何 integer 类型。 除上述 boolean 转换涵盖的情况外,规则为:
The fractional part is discarded (truncated towards zero).
- 如果结果值可以由目标类型表示,则使用该值
- 否则,行为未定义
假设你有一个健全的平台,你的sizeof(int)
是 4 和INT_MAX=2147483647
。 pow(10, 10)
的结果是(double)10000000000.0
并且它的小数部分在目标 integer 类型(int)
中无法表示。 您的代码的行为只是undefined 。
4 字节 integer 可以容纳的最大值范围为 -2,147,483,648 到 2,147,483,647。 10^10 的结果是 10,000,000,000,超出了限制,转换溢出,产生了意想不到的结果。 就这样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.