С чем связан максимальный диапазон значений примитивных типов в Java?

Ответ

Максимальный диапазон значений в Java определяется разрядностью (количеством бит) примитивных типов данных и их представлением в памяти (знаковое/беззнаковое).

Основные типы и их пределы:

Тип Размер Диапазон
byte 8 бит -128 до 127
short 16 бит -32 768 до 32 767
int 32 бита -2³¹ до 2³¹-1 (≈ ±2.14 млрд)
long 64 бита -2⁶³ до 2⁶³-1 (≈ ±9.22×10¹⁸)
char 16 бит 0 до 65 535 (беззнаковый)

Почему именно такие пределы?

  • Для знаковых целых типов (byte, short, int, long) используется дополнительный код (two's complement). Один бит отводится под знак, поэтому диапазон несимметричен (например, для int: -2³¹ до 2³¹-1).
  • Максимальные значения доступны через константы классов-обёрток:
int maxInt = Integer.MAX_VALUE;     // 2_147_483_647
long maxLong = Long.MAX_VALUE;      // 9_223_372_036_854_775_807
int maxArraySize = Integer.MAX_VALUE - 8; // Практический предел размера массива

Для работы с числами вне диапазона используется класс BigInteger (произвольная точность).

Ответ 18+ 🔞

Давай разберём эту всю хуйню с диапазонами в Java, а то народ путается, как слепой кот в сортире.

Вот смотри, всё просто, как три копейки. Каждому примитивному типу выделяется своя камера в памяти — определённое количество битов. И от этого, блядь, всё и пляшет. Больше битов — больше цифр влезет, меньше битов — быстрее словишь переполнение, как дурак на ровном месте.

Основные зэки нашей тюрьмы типов вот кто:

Тип Размер (биты) От сих и до сих
byte 8 От -128 до 127
short 16 От -32 768 до 32 767
int 32 От -2³¹ до 2³¹-1 (это примерно ±2.14 миллиарда)
long 64 От -2⁶³ до 2⁶³-1 (это, сука, ±9.22 квинтиллиона)
char 16 От 0 до 65 535 (этот чувак беззнаковый, всегда положительный)

А теперь, ёпта, почему так криво? Почему, например, у int максимум 2 147 483 647, а минимум -2 147 483 648? Почему не поровну? А потому что для знаковых типов используется дополнительный код (two's complement). Один битик забирают на знак (плюс или минус), вот и получается эта асимметрия. Гениально и подло, как удар ниже пояса.

Чтобы не запоминать эти ёбаные циферки, в Java есть готовые константы в классах-обёртках. Бери и пользуйся, не хуй собачий:

int maxInt = Integer.MAX_VALUE;     // 2_147_483_647
long maxLong = Long.MAX_VALUE;      // 9_223_372_036_854_775_807
int maxArraySize = Integer.MAX_VALUE - 8; // Практический предел, так сказать

А если тебе нужно посчитать, например, бюджет какого-нибудь государства или число атомов во вселенной, и обычные long уже не спасают — на сцену выходит тяжёлая артиллерия: класс BigInteger. Эта поебота умеет работать с числами любой, блядь, длины, хоть до конца времён. Правда, и тормозит соответственно, но зато точность — овердохуищная.

Вот и вся магия, никакой ебли с бубном. Запомнил табличку — и вперёд, к новым свершениям, пока не наступил на грабли переполнения.