Являются ли примитивные целочисленные типы в Java знаковыми?

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

Ответ

Да, все основные примитивные целочисленные типы в Java (byte, short, int, long) являются знаковыми (signed). Они используют представление в дополнительном коде (two's complement) и могут хранить как положительные, так и отрицательные значения.

Диапазоны значений:

Тип Размер Диапазон (от ... до)
byte 8 бит -128 ... 127
short 16 бит -32,768 ... 32,767
int 32 бит -2³¹ ... 2³¹-1 (примерно ±2.14 млрд)
long 64 бит -2⁶³ ... 2⁶³-1

Пример:

int positive = 2_147_483_647; // Integer.MAX_VALUE
int negative = -2_147_483_648; // Integer.MIN_VALUE

Особенности и работа с беззнаковыми значениями:

  • Беззнаковая арифметика: В Java нет беззнаковых (unsigned) примитивных типов. Однако, начиная с Java 8, в классы-обёртки добавлены статические методы для интерпретации значений как беззнаковых.

    // Чтение беззнакового значения из строки
    int unsignedInt = Integer.parseUnsignedInt("4294967295");
    // Сравнение двух int как беззнаковых чисел
    int result = Integer.compareUnsigned(a, b);
  • Исключение — char: Тип char является единственным 16-битным беззнаковым целочисленным типом в Java. Его диапазон: от 0 до 65535 (u0000 до uffff). Он предназначен для хранения символов Unicode.