Почему 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
}