.NET vs Mono:从2 ^ 32转换为double的不同结果

时间:2015-02-10 22:55:00

标签: c# .net mono

TL; DR 为什么(int)Math.Pow(2,32)会在Mono上返回0而在.NET上返回Int32.MinValue


在Mono上测试我编写的.NET代码时,我偶然发现了以下几行:

var i = X / ( (int)Math.Pow(2,32) ); 那条线当然没有多大意义,我已经把它改为long

然而,我很好奇为什么我的代码没有在.NET上抛出DivideByZeroException所以我已经在Mono和.NET上检查了该表达式的返回值

有人可以向我解释结果吗?

2 个答案:

答案 0 :(得分:5)

恕我直言,这个问题是学术性的;文档仅承诺"the result is an unspecified value of the destination type",因此每个平台都可以随意做任何事情。

在投射可能溢出的结果时应该非常小心。如果存在这种可能性,并且获得特定结果而不是给定平台提供的任意实现非常重要,则应使用checked关键字并捕获任何OverflowException可能会发生,用任何明确的行为来处理它。

答案 1 :(得分:2)

“结果是目标类型的未指定值”。我认为看看.NET实现中实际发生的事情会很有趣。

与IL中的OpCodes.Conv_I4 Field有关:" Conversion from floating-point numbers to integer values truncates the number toward zero. When converting from a float64 to a float32, precision can be lost. If value is too large to fit in a float32 (F), positive infinity (if value is positive) or negative infinity (if value is negative) is returned. If overflow occurs converting one integer type to another, the high order bits are truncated"它再次说溢出是未指定的。