Ответ
Максимальный диапазон значений в 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. Эта поебота умеет работать с числами любой, блядь, длины, хоть до конца времён. Правда, и тормозит соответственно, но зато точность — овердохуищная.
Вот и вся магия, никакой ебли с бубном. Запомнил табличку — и вперёд, к новым свершениям, пока не наступил на грабли переполнения.