【发布时间】:2014-06-18 16:53:21
【问题描述】:
在 C 编程中,我发现了一个奇怪的问题,这与我的直觉相反。当我将integer 声明为INT_MAX(2147483647,在limits.h 中定义)并隐式将其转换为float 值时,它工作正常,即浮点值与最大整数相同.然后,我将浮点数转换回整数,有趣的事情发生了。新的integer 成为最小整数 (-2147483648)。
源代码如下:
int a = INT_MAX;
float b = a; // b is correct
int a_new = b; // a_new becomes INT_MIN
我不确定当浮点数 b 转换为整数 a_new 时会发生什么。那么,有没有合理的解决方案来找到integer和float类型之间可以来回切换的最大值?
PS:INT_MAX - 100 的值可以正常工作,但这只是一个任意的解决方法。
【问题讨论】:
-
浮点的精度有限,所以我不认为这种转换很奇怪。
-
与您的评论相反,
b是不正确的。如果你仔细看,我想你会发现它实际上是第一次转换后的INT_MAX+1。INT_MAX在您的平台上是 2147483647,不是 2147483648。即,第一次转换是第一次引入结果增量的地方。 See it live -
4 字节浮点数使用 23 位存储尾数,使用 9 位存储符号和指数。这意味着无法完全准确地存储最大的 32 位整数。
-
看起来问题并非在所有平台上都发生:见example here
-
@AurélienGasser 这是一个谬论。我确信编译器默认会优化。禁用优化,然后查看结果。有问题的数字不能完全表示为浮点数,因此无法取回。
标签: c type-conversion integer-overflow