Проверка целого числа по пределам типа short
На предыдущем этапе мы узнали, как объявлять и использовать переменные типа short
в рамках их допустимого диапазона. Теперь давайте рассмотрим, что происходит, когда мы пытаемся присвоить значение, выходящее за пределы диапазона short
, переменной типа short
.
В Java есть различные целочисленные типы данных, включая byte
, short
, int
и long
, каждый с разным диапазоном значений. Тип int
(целое число) представляет собой 32 - разрядное знаковое целое число в дополнительном коде с диапазоном от -2 147 483 648 до 2 147 483 647. Этот диапазон значительно шире, чем у типа short
.
Когда вы пытаетесь присвоить значение из более широкого типа данных (например, int
) более узкому типу (например, short
), Java требует, чтобы вы явно указали, что вы осознаете возможную потерю информации. Это называется приведением типов (type casting). Если вы не выполните приведение типов, Java выдаст ошибку компиляции, чтобы предотвратить случайную потерю данных.
Давайте модифицируем нашу программу HelloJava.java
, чтобы продемонстрировать это.
-
Откройте файл HelloJava.java
в редакторе WebIDE.
-
Замените существующий код следующим:
public class HelloJava {
public static void main(String[] args) {
int largeInt = 40000; // This value is outside the short range
// Attempt to assign largeInt to a short variable without casting
// short myShort = largeInt; // This line will cause a compilation error
// To assign a value from a larger type, we need to cast it
short myShort = (short) largeInt;
System.out.println("Value of largeInt cast to short: " + myShort);
int anotherLargeInt = -40000; // Another value outside the short range
short anotherShort = (short) anotherLargeInt;
System.out.println("Value of anotherLargeInt cast to short: " + anotherShort);
}
}
В этом обновленном коде:
- Мы объявляем переменную
largeInt
типа int
со значением 40000, которое превышает максимальное значение, которое может хранить тип short
(32767).
- Закомментированная строка
short myShort = largeInt;
показывает, что произойдет без приведения типов - ошибка компиляции.
- Строка
short myShort = (short) largeInt;
демонстрирует, как привести значение типа int
к типу short
. (short)
перед largeInt
- это оператор приведения типов.
- Мы делаем то же самое для отрицательного значения
anotherLargeInt
(-40000), которое меньше минимального значения, которое может хранить тип short
(-32768).
-
Сохраните файл (Ctrl+S или Cmd+S).
-
Теперь скомпилируйте модифицированную программу в терминале:
javac HelloJava.java
На этот раз компиляция должна пройти успешно, так как мы использовали приведение типов.
-
Запустите скомпилированную программу:
java HelloJava
Вы увидите вывод, похожий на следующий:
Value of largeInt cast to short: -25536
Value of anotherLargeInt cast to short: 25536
Обратите внимание, что выходные значения (-25536 и 25536) не совпадают с исходными значениями (40000 и -40000). Это происходит потому, что при приведении значения, выходящего за пределы диапазона целевого типа данных, значение "зацикливается". Это пример переполнения (overflow) (для положительных значений, превышающих максимум) и недополнения (underflow) (для отрицательных значений, превышающих минимум). Точное результирующее значение зависит от того, как числа представлены в двоичной системе. Это демонстрирует, почему важно понимать диапазоны типов данных и аккуратно использовать приведение типов, чтобы избежать непредвиденных результатов.