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

mig*_*jek 1 .net c# mono

TL; DR为什么(int)Math.Pow(2,32)返回0Mono和Int32.MinValue.NET?


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

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

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

有人可以解释一下结果吗?

Pet*_*iho 5

恕我直言,问题是学术上的; 文档仅承诺"结果是目标类型的未指定值",因此每个平台都可以随意执行任何操作.

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