← Назад к вопросам

Какая особенность целого числа?

1.0 Junior🔥 181 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какая особенность целого числа

Целые числа в 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 для проверок диапазонов