Сравнение целого числа с пределами байта
На предыдущем этапе мы узнали о диапазоне типа данных byte
(-128 до 127). Теперь давайте посмотрим, что произойдет, если мы попытаемся присвоить целочисленное значение, выходящее за этот диапазон, переменной типа byte
.
В Java есть другие целочисленные типы данных, такие как int
, которые могут хранить гораздо большие значения. Когда вы пытаетесь поместить большее значение в меньший контейнер (например, поместить значение int
в byte
), вы можете столкнуться с проблемами.
-
Откройте файл HelloJava.java
в редакторе WebIDE.
-
Измените метод main
, чтобы он включал целочисленное значение, выходящее за диапазон байта. Замените существующий код внутри метода main
следующим:
public static void main(String[] args) {
int largeIntValue = 200; // This value is outside the byte range
// Trying to assign a large int value to a byte variable
// byte myByte = largeIntValue; // This line will cause a compilation error
System.out.println("Integer value: " + largeIntValue);
// To assign a larger integer to a byte, you need a cast
byte castedByte = (byte) largeIntValue;
System.out.println("Casted byte value: " + castedByte);
}
Рассмотрим внесенные изменения:
- Мы объявляем переменную
int
с именем largeIntValue
и присваиваем ей значение 200, которое больше максимального значения, которое может хранить byte
(127).
- Закомментированная строка
byte myByte = largeIntValue;
показывает, что произойдет, если вы напрямую попытаетесь присвоить largeIntValue
переменной типа byte
. Это вызовет ошибку компиляции, так как Java не позволяет потенциально потерять данные без явного указания на это.
- Строка
byte castedByte = (byte) largeIntValue;
демонстрирует, как принудительно выполнить присвоение с использованием приведения типов. (byte)
перед largeIntValue
сообщает Java преобразовать значение int
в byte
.
-
Сохраните файл (Ctrl+S или Cmd+S).
-
Теперь попробуйте скомпилировать измененную программу в терминале:
javac HelloJava.java
На этот раз компиляция должна пройти успешно, так как мы использовали приведение типов.
-
Запустите скомпилированную программу:
java HelloJava
Вы увидите следующий вывод:
Integer value: 200
Casted byte value: -56
Обратите внимание, что значение castedByte
равно -56, а не 200. Это происходит потому, что когда вы приводите значение, выходящее за диапазон целевого типа, значение "зацикливается". Это называется переполнением (или потерянной точностью для отрицательных чисел). Значение 200 представлено в двоичной системе, и когда оно усекается до 8 бит (байта), получается значение -56.
Этот этап подчеркивает важность понимания диапазонов типов данных и осторожного использования приведения типов при преобразовании между различными типами, чтобы избежать непредвиденных результатов из-за переполнения или потерянной точности.