Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Какая особенность целого числа
Целые числа в Java имеют несколько важных особенностей, которые следует знать при работе с ними.
1. Диапазон значений для целых типов
В Java есть четыре целочисленных примитивных типа:
// byte: -128 до 127 (8 бит)
byte b = 127;
// short: -32768 до 32767 (16 бит)
short s = 32767;
// int: -2147483648 до 2147483647 (32 бита)
int i = 2147483647;
// long: -9223372036854775808 до 9223372036854775807 (64 бита)
long l = 9223372036854775807L;
Ключевой момент: если число выходит за диапазон, происходит переполнение:
int max = Integer.MAX_VALUE; // 2147483647
int overflow = max + 1; // Переходит в Integer.MIN_VALUE!
System.out.println(overflow); // -2147483648
2. Знаковые (signed) числа
Все целые типы в Java знаковые (включают положительные и отрицательные):
int positive = 42;
int negative = -42;
int zero = 0;
int minusOne = -1;
В памяти используется представление "дополнение до двойки" (Two's complement).
3. Автоматическое расширение типов (type promotion)
При операциях с меньшими типами они автоматически расширяются:
byte a = 10;
byte b = 20;
// Плохо — ошибка компиляции!
// byte result = a + b;
// Хорошо
byte result = (byte) (a + b);
int result2 = a + b;
Правило: операции между byte/short/int результатом всегда дают int или более широкий тип.
4. Integer.MAX_VALUE и Integer.MIN_VALUE
Полезные константы для проверки диапазонов:
System.out.println("Max int: " + Integer.MAX_VALUE); // 2147483647
System.out.println("Min int: " + Integer.MIN_VALUE); // -2147483648
public static long safeLongCast(int value) {
return (long) value;
}
if (value >= Integer.MIN_VALUE && value <= Integer.MAX_VALUE) {
int i = (int) value;
}
5. Immutability (неизменяемость)
Примитивные целые числа неизменяемы:
int x = 10;
Integer y = 10;
x = 20; // Это новое значение, не изменение старого
Integer a = new Integer(10);
Integer b = a;
a = 20; // Это создаёт новый объект Integer
6. Boxing и Unboxing
Преобразование между примитивом int и объектом Integer:
// Boxing (автоматическое)
Integer boxed = 42;
// Unboxing (автоматическое)
int primitive = boxed;
// Вручную
Integer manualBox = Integer.valueOf(42);
int manualUnbox = boxed.intValue();
Осторожно: null при unboxing вызывает NullPointerException:
Integer nullable = null;
int primitive = nullable; // NullPointerException!
int safe = nullable != null ? nullable : 0;
int safest = Optional.ofNullable(nullable).orElse(0);
7. Переполнение и недополнение
Переполнение происходит без исключения — просто переходит на другой конец диапазона:
int max = Integer.MAX_VALUE;
System.out.println(max); // 2147483647
System.out.println(max + 1); // -2147483648 (overflow!)
System.out.println(max + 2); // -2147483647
long safeLong = (long) max + 1;
System.out.println(safeLong); // 2147483648 (правильно)
8. Сравнение Integer объектов
Опасно использовать == для сравнения объектов Integer:
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true (кэширование для -128..127)
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false (нет кэширования)
System.out.println(a.equals(b)); // true
System.out.println(c.equals(d)); // true
Java кэширует Integer от -128 до 127, поэтому == может работать неожиданно.
9. Переполнение в циклах
Частая ошибка при счётчиках:
// Плохо — может быть бесконечный цикл
for (int i = 0; i < 1_000_000_000; i++) {
if (i == Integer.MAX_VALUE) {
i++; // i переходит в Integer.MIN_VALUE!
}
}
// Хорошо — используй long
for (long i = 0; i < 10_000_000_000L; i++) {
// Безопасно
}
10. Division by zero
Целые числа не могут делиться на ноль — вызывает ArithmeticException:
try {
int result = 10 / 0; // ArithmeticException!
} catch (ArithmeticException e) {
System.out.println("Cannot divide by zero");
}
double result = 10.0 / 0.0; // Infinity (не исключение)
Ключевые рекомендации
- Используй int по умолчанию для целых чисел
- Используй long если нужны большие значения или долгие счётчики
- Проверяй переполнение если работаешь с неизвестными входными данными
- Избегай == для Integer, используй .equals()
- Будь осторожен с unboxing null значений
- Используй Integer.MAX_VALUE / MIN_VALUE для проверок диапазонов