为什么Double.MaxValue转换为整数类型会产生负值,即该类型的最小值?
double maxDouble = double.MaxValue; // 1.7976931348623157E+308
long maxDoubleLong = (long) maxDouble; // -9223372036854775808
Run Code Online (Sandbox Code Playgroud)
我理解编译器错误,如果它太大或OverflowException在运行时或者如果我使用unchecked转换可能不会抛出异常,但结果变得不确定和不正确(负).
同样奇怪的是,价值是long.MinValue:
bool sameAsLongMin = maxDoubleLong == long.MinValue; // true
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果我把它投射到同样的情况int:
int maxDoubleInt = (int)maxDouble; // -2147483648
bool sameAsIntMin = maxDoubleInt == int.MinValue; // true
Run Code Online (Sandbox Code Playgroud)
如果它试图将它转换为decimal我OverflowException在运行时获得
decimal maxDoubleDec = (decimal)maxDouble; // nope
Run Code Online (Sandbox Code Playgroud)
更新:似乎迈克尔和巴雷的答案在头上钉了一针,如果我checked明确使用我得到一个OverflowException:
checked
{
double maxDouble = double.MaxValue; // 1.7976931348623157E+308
long maxDoubleLong = (long) maxDouble; // …Run Code Online (Sandbox Code Playgroud)