.NET vs Mono:从 2^32 转换为 double 到 int 的不同结果
.NET vs Mono: different results for conversion from 2^32 as double to int
TL;DR 为什么 (int)Math.Pow(2,32)
return 0
在 Mono 上而 Int32.MinValue
在 .NET 上?
在 Mono 上测试我的 .NET 编写的代码时,我偶然发现了以下行:
var i = X / ( (int)Math.Pow(2,32) );
好吧,那行当然没有多大意义,我已经将它更改为 long
。
不过我很好奇为什么我的代码没有在 .NET 上抛出 DivideByZeroException
所以我检查了 Mono 和 .NET 上该表达式的 return 值
谁能给我解释一下结果?
恕我直言,这个问题是学术性的;文档只承诺 "the result is an unspecified value of the destination type",因此每个平台都可以自由地做任何它想做的事情。
在转换可能溢出的结果时应该非常小心。如果有这种可能性,并且重要的是获得特定结果而不是给定平台提供的任意实现,则应使用 checked 关键字并捕获可能发生的任何 OverflowException
,处理它具有所需的任何显式行为。
"the result is an unspecified value of the destination type"。我认为了解 .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"
它再次表示未指定溢出。
TL;DR 为什么 (int)Math.Pow(2,32)
return 0
在 Mono 上而 Int32.MinValue
在 .NET 上?
在 Mono 上测试我的 .NET 编写的代码时,我偶然发现了以下行:
var i = X / ( (int)Math.Pow(2,32) );
好吧,那行当然没有多大意义,我已经将它更改为 long
。
不过我很好奇为什么我的代码没有在 .NET 上抛出 DivideByZeroException
所以我检查了 Mono 和 .NET 上该表达式的 return 值
谁能给我解释一下结果?
恕我直言,这个问题是学术性的;文档只承诺 "the result is an unspecified value of the destination type",因此每个平台都可以自由地做任何它想做的事情。
在转换可能溢出的结果时应该非常小心。如果有这种可能性,并且重要的是获得特定结果而不是给定平台提供的任意实现,则应使用 checked 关键字并捕获可能发生的任何 OverflowException
,处理它具有所需的任何显式行为。
"the result is an unspecified value of the destination type"。我认为了解 .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"
它再次表示未指定溢出。