> Как посчитать количество значений в типе int (Java)

Уровень: senior · Роль: backend · Язык: Java · Категория: Технические вопросы

Компании: Сбер

Стек: Go, Java

> Пример ответа

Короткий ответ

Количество значений в типе int в Java - это 2^32 = 4 294 967 296. Диапазон значений: от -2 147 483 648 до 2 147 483 647. В Java int всегда 32-битный знаковый тип, независимо от платформы. Это фиксировано спецификацией языка. Для подсчёта в коде можно использовать (long) Integer.MAX_VALUE - Integer.MIN_VALUE + 1 или 1L << 32.

Подробное объяснение

Тип int в Java - это 32-битное знаковое целое, представленное в two's complement. Количество возможных значений определяется количеством бит: 2^32. Из них половина - отрицательные (-2^31 до -1), одно значение - ноль, и 2^31 - 1 положительных.

Важно, что в Java нет unsigned-типов (кроме char), поэтому весь диапазон int - это [-2^31, 2^31 - 1]. Размер int не зависит от архитектуры - это гарантируется JLS (Java Language Specification), в отличие от C/C++.

Формула для вычисления количества значений: MAX_VALUE - MIN_VALUE + 1. Поскольку MAX_VALUE = 2^31 - 1, а MIN_VALUE = -2^31, получаем (2^31 - 1) - (-2^31) + 1 = 2^32.

На практике

В реальном коде редко нужно явно считать количество значений, но это важно понимать при:

  • работе с границами массивов и коллекций;
  • расчёте переполнений (overflow);
  • выборе типа данных для хранения больших чисел;
  • реализации хеш-функций или генераторов.

Если нужно получить количество в коде, безопаснее использовать long, так как 2^32 не помещается в int. Также можно использовать Integer.toUnsignedLong(Integer.MAX_VALUE) + 1L - но это избыточно.

Пример кода

JAVA
public class IntRange {
public static void main(String[] args) {
// Количество значений в int
long count = (long) Integer.MAX_VALUE - Integer.MIN_VALUE + 1;
System.out.println("Count: " + count); // 4294967296
// Альтернативный способ
long count2 = 1L << 32;
System.out.println("Count2: " + count2); // 4294967296
// Диапазон
System.out.println("Min: " + Integer.MIN_VALUE); // -2147483648
System.out.println("Max: " + Integer.MAX_VALUE); // 2147483647
}
}

Как отвечать на собеседовании

Начните с прямого ответа: 2^32. Затем поясните, что int - 32-битный знаковый тип, диапазон [-2^31, 2^31 - 1]. Упомяните, что в Java размер фиксирован спецификацией, в отличие от C/C++. Если спросят про подсчёт в коде, покажите формулу с long, чтобы избежать переполнения. Можно добавить, что Integer.MAX_VALUE - Integer.MIN_VALUE + 1 в int даст неправильный результат из-за переполнения, поэтому нужен long.

Что проверяет интервьюер

Интервьюер проверяет:

  • понимание битового представления и two's complement;
  • знание границ int наизусть;
  • осознание проблемы переполнения при арифметике с границами;
  • понимание того, что размер примитивов в Java платформонезависим;
  • умение объяснить простую вещь точно и без лишней воды.

Типичные ошибки

  • Ответ 2^31 или 2^31 - 1 - это количество положительных значений, а не всех.
  • Использование Integer.MAX_VALUE - Integer.MIN_VALUE + 1 без приведения к long - результат переполнится и будет -1.
  • Утверждение, что размер int зависит от платформы - в Java это не так.
  • Путаница с Integer.SIZE - это количество бит (32), а не количество значений.
  • Забывают про ноль, когда считают диапазон как 2 * 2^31 - это тоже даёт 2^32, но объяснение должно быть корректным.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью