что-то меня озадачивает, и я не нашел много информации о спецификациях виртуальной машины. Это немного неясно, и было бы неплохо, если бы кто-нибудь мог мне объяснить.
Эти несколько строк кода.....
double myTest = Double.MAX_VALUE;
System.out.println("1. float: " + (float)myTest);
System.out.println("2. int: " + (int)myTest);
System.out.println("3. short: " + (short)myTest);
System.out.println("4. byte: " + (byte)myTest);
..... произвести этот вывод:
- поплавок: бесконечность
- инт: 2147483647
- коротко: -1
- байт: -1
byte
, short
и int
— это 8, 16, 32 бита с дополнением до двух. float
и double
— это 32- и 64-разрядные версии IEEE 754 (см. здесь).
Насколько я понимаю, максимальное значение double
подразумевает, что все биты мантиссы (52 бита) переключаются на 1. Поэтому не (очень) удивительно, что приведение к короткому или байтовому возвращает -1, т.е. все биты переключаются до 1. Кажется, что приведение сохраняет «хвост» double
, чтобы он соответствовал 8-битному byte
или 16-битному short
.
Что меня удивляет, так это актерский состав int
и, в меньшей степени, актерский состав float
. Как можно получить «2. int: 2147483647», который равен 0x7FFFFFFFF, максимальное значение пока короткое, а байты 3 и 4 равны -1?
Актерский состав float
тоже странный. Если бы 32 бита в «хвосте» myTest
были сохранены, то не должен ли он генерировать NaN
?