Ответ
Диапазон значений примитивных типов в Java жестко задан языком и определяется двумя факторами:
- Размер в памяти (количество бит). Это основной ограничивающий фактор.
- Способ представления данных в памяти (формат). Для целых чисел используется дополнительный код (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 (переполнение)!