От чего зависит диапазон значений примитивных типов данных в Java?

«От чего зависит диапазон значений примитивных типов данных в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Диапазон значений примитивных типов в Java жестко задан языком и определяется двумя факторами:

  1. Размер в памяти (количество бит). Это основной ограничивающий фактор.
  2. Способ представления данных в памяти (формат). Для целых чисел используется дополнительный код (two's complement), что определяет симметричный диапазон для знаковых типов. Для чисел с плавающей точкой — стандарт IEEE 754.

Таблица примитивных типов Java:

Тип Размер Диапазон / Описание Пример литерала
byte 8 бит -128 ... 127 byte b = 100;
short 16 бит -32,768 ... 32,767 short s = 30_000;
int 32 бит -2³¹ ... 2³¹-1 (≈ ±2.1 млрд) int i = 1_000_000;
long 64 бит -2⁶³ ... 2⁶³-1 long l = 10_000_000_000L; (требуется суффикс L)
float 32 бит Числа с плавающей точкой одинарной точности (IEEE 754) float f = 3.14f; (требуется суффикс f)
double 64 бит Числа с плавающей точкой двойной точности (стандарт для дробных) double d = 3.14;
char 16 бит 0 ... 65,535 (беззнаковый, представляет символ Unicode) char c = 'A';
boolean ~1 бит* true или false. Точный размер не определен JLS и зависит от JVM. boolean flag = true;

Почему это важно? Выбор типа влияет на:

  • Потребление памяти: Использование byte или short вместо int в больших массивах экономит память.
  • Точность вычислений: Использование double вместо float для финансовых расчетов (хотя для денег лучше BigDecimal).
  • Переполнение (overflow): Выход за границы диапазона приводит к некорректным значениям без предупреждения.
    int maxInt = Integer.MAX_VALUE; // 2147483647
    int overflow = maxInt + 1;      // станет -2147483648 (переполнение)!