【发布时间】:2010-11-01 22:19:38
【问题描述】:
我在将Int32.MaxValue 双向转换为System.Single 时遇到了意外结果:
Int32 i = Int32.MaxValue;
Single s = i;
Int32 c = (Int32)s;
Debug.WriteLine(i); // 2147483647
Debug.WriteLine(c); // -2147483648
我意识到它一定是溢出了,因为Single 在有效数字中没有足够的位来保存Int32 的值,所以它向上取整。当我在 IL 中将 conv.r4 更改为 conv.r4.ovf 时,会抛出 OverflowExcpetion。够公平的......
但是,当我在调查这个问题时,我在 java 中编译了这段代码并运行它并得到以下结果:
int i = Integer.MAX_VALUE;
float s = (float)i;
int c = (int)s;
System.out.println(i); // 2147483647
System.out.println(c); // 2147483647
我对 JVM 了解不多,但我想知道它是如何做到的。这似乎不那么令人惊讶,但它如何在舍入到 2.14748365E9 后保留额外的数字?它是否保留某种内部表示,然后在转换回int 时替换它?还是只是向下舍入到Integer.MAX_VALUE 以避免溢出?
【问题讨论】:
标签: jvm floating-point clr int