Программирование на Java


Преобразование примитивных типов (расширение и сужение) - часть 3


float fmin = Float.NEGATIVE_INFINITY; float fmax = Float.POSITIVE_INFINITY; print("long: " + (long)fmin + ".." + (long)fmax);

print("int: " + (int)fmin + ".." + (int)fmax);

print("short: " + (short)fmin + ".." + (short)fmax);

print("char: " + (int)(char)fmin + ".." + (int)(char)fmax);

print("byte: " + (byte)fmin + ".." + (byte)fmax);

Результатом будет:

long: -9223372036854775808..9223372036854775807 int: -2147483648..2147483647 short: 0..-1 char: 0..65535 byte: 0..-1

Значения long и int вполне очевидны - дробные бесконечности преобразовались в, соответственно, минимально и максимально возможные значения этих типов. Результат для следующих трех типов (short, char, byte) есть, по сути, дальнейшее сужение значений, полученных для int, согласно второму шагу процедуры преобразования. А делается это, как было описано, просто за счет отбрасывания старших битов. Вспомним, что минимально возможное значение в битовом виде представляется как 1000..000 (всего 32 бита для int, то есть единица и 31 ноль). Максимально возможное - 1111..111 (32 единицы). Отбрасывая старшие биты, получаем для отрицательной бесконечности результат 0, одинаковый для всех трех типов. Для положительной же бесконечности получаем результат, все биты которого равняются 1. Для знаковых типов byte и short такая комбинация рассматривается как -1, а для беззнакового char - как максимально возможное значение, то есть 65535.

Может сложиться впечатление, что для char приведение дает точное значение. Однако это был частный случай - отбрасывание битов в большинстве случаев все же дает искажение. Например, сужение дробного значения 2 миллиарда:

float f=2e9f; print((int)(char)f); print((int)(char)-f);

Результатом будет:

37888 27648

Обратите внимание на двойное приведение для значений типа char в двух последних примерах. Понятно, что преобразование от char к int не приводит к потере точности, но позволяет распечатывать не символ, а его числовой код, что более удобно для анализа.

В заключение еще раз обратим внимание на то, что примитивные значения типа boolean могут участвовать только в тождественных преобразованиях.




- Начало -  - Назад -  - Вперед -



Книжный магазин