Почему Double.MaxValue
, приведённый к интегральному типу, приводит к отрицательному значению, наименьшему значению этого типа?
double maxDouble = double.MaxValue; // 1.7976931348623157E+308
long maxDoubleLong = (long) maxDouble; // -9223372036854775808
Я бы понял ошибку компилятора, если он слишком большой или OverflowException
во время выполнения, или если я буду использовать unchecked
, что преобразование может не вызывать исключение, но результат становится undefined и неверным (отрицательный).
Также странно, что значение long.MinValue
:
bool sameAsLongMin = maxDoubleLong == long.MinValue; // true
Кстати, то же самое происходит, если я отбрасываю его на int
:
int maxDoubleInt = (int)maxDouble; // -2147483648
bool sameAsIntMin = maxDoubleInt == int.MinValue; // true
Если он пытается передать его в decimal
, я получаю OverflowException
во время выполнения
decimal maxDoubleDec = (decimal)maxDouble; // nope
Обновить: кажется, что ответы Майкла и Барра ударяют ноготь по голове, если я использую checked
явно, я получаю OverflowException
:
checked
{
double maxDouble = double.MaxValue; // 1.7976931348623157E+308
long maxDoubleLong = (long) maxDouble; // nope
}