Вопрос про сужение типов
Хотел бы получить объяснение про преобразование бесконечности к целочисленным типам. Например:
double d = Double.POSITIVE_INFINITY;
System.out.println((int)d); // 2147483647
System.out.println((int)0x7ff0000000000000L); // 0
System.out.println((int)(double)0x7ff0000000000000L); // 2147483647
Я создаю переменную d типа double и присваиваю ей значение положительной бесконечности. Далее, я преобразовываю эту бесконечность к типу int и на выходе получаю значение 2147483647.
Вопрос 1: почему дробная положительная бесконечность преобразовалась в максимальное возможное значение для int?
Далее, среда разработки показывает, что POSITIVE_INFINITY это некое число в шестнадцатеричной системе счисления (0x7ff0000000000000L). На выходе мы получаем, что это число в int будет равно 0. Используя обычный калькулятор перевода чисел из одной системы в другую получим число (0x7ff0000000000000L) в двоичной системе - 111111111110000000000000000000000000000000000000000000000000000.
Вопрос 2. Последние 32 бита равны 0, старшие биты откидываются и поэтому int равен 0? Вопрос 3. Почему Double.POSITIVE_INFINITY(0x7ff0000000000000L) имеет на конце литерал L? Это же не лонг? Вопрос 4. Почему, когда в 4 строчке кода я вывожу:
System.out.println((int)(double)0x7ff0000000000000L);
Результатом получается снова максимальное число для int? Как происходит в данном случае сужение типа? Прошу объяснить эти моменты. Хочу докопаться до истины.