Приведение двойного к другому числовому типу
меня что-то озадачивает, и я не нашел много информации о характеристиках виртуальной машины. Это немного неясно, и было бы неплохо, если бы кто-то мог мне объяснить.
Эти несколько строк кода .....
<code>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); </code>
..... произвести этот вывод:
плавать: бесконечностьint: 2147483647короткий: -1байт: -1byte
, 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», равное 0x7FFFFFFF, максимальное значение при коротком, а байты 3. и 4. равны -1?
Актерский составfloat
тоже странно. Если 32 бита в «хвосте»myTest
были сохранены, то не должно ли оно генерироватьNaN
?