我有两个代码片段,都产生了不同的结果。我使用的是 TDM-GCC 4.9.2 编译器,我的编译器是 32 位版本
( int 的大小是 4 个字节,float 的最小值是 -3.4e38 )
代码 1:
int x;
x=2.999999999999999; // 15 '9s' after decimal point
printf("%d",x);
输出:
2
代码 2:
int x;
x=2.9999999999999999; // 16 '9s' after decimal point
printf("%d",x);
输出:
3
为什么隐式转换在这些情况下不同?
是否是由于指定的 Real 常量发生溢出?如果是,那是怎么发生的?
最佳答案
(将此答案限制为 IEEE754)。
当您将常量分配给 float 时,IEEE754 标准要求选择最接近 的可能 float 。您提供的两个数字都不能准确表示。
最接近 2.999999999999999
的 IEEE754 double float
是 2.99999999999999911182158029987476766109466552734375
而最接近 2.9999999999999999
的是 3
。
因此输出。转换为整数类型会将值截断为零。
使用 round
是避免这种影响的一种方法。
关于c - float常量隐式转换为int类型什么时候会溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56498425/