c - float常量隐式转换为int类型什么时候会溢出

标签 c implicit-conversion

我有两个代码片段,都产生了不同的结果。我使用的是 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 是避免这种影响的一种方法。

进一步阅读:Is floating point math broken?

关于c - float常量隐式转换为int类型什么时候会溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56498425/

相关文章:

c - 字符串分配段错误 - 为什么会发生这种情况?

c++ - 如果将这个函数放在通用库中会导致什么错误?

c++ - 从 'int' 到非标量类型赋值运算符的转换 - object 到 int

c - 数组索引和通常的算术转换

c - icu unicode 中是否有等效的 strdup ?

c - 厕所 : standard input: Bad file descriptor on fork + pipe + execlp

c - 为什么我的程序在写入文件时崩溃?

xml - Scala:处理可选的 XML 元素和 Case 类

java - java中的隐式转换运算符+=

c# - 为什么 Linq Cast<> 助手不能与隐式转换运算符一起使用?