繁体   English   中英

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;
    }

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM