Поддерживает ли Java беззнаковые (unsigned) примитивные типы данных?

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

Ответ

Нет, в Java нет беззнаковых примитивных типов (unsigned byte, unsigned short, unsigned int, unsigned long). Все целочисленные примитивы (byte, short, int, long) являются знаковыми (signed).

Почему так сделано? Основная причина — упрощение языка и избежание распространенных ошибок, связанных с неявным приведением беззнаковых типов, как в C/C++.

Как работать с беззнаковыми значениями? Java предоставляет методы в классах-обертках для интерпретации значений как беззнаковых.

Примеры:

// 1. byte (диапазон signed: -128..127, unsigned: 0..255)
byte signedByte = -100;
int unsignedValue = Byte.toUnsignedInt(signedByte); // 156
System.out.println(unsignedValue);

// 2. int (диапазон signed: -2^31..2^31-1, unsigned: 0..2^32-1)
int signedInt = -1; // В битах: 0xFFFFFFFF
long unsignedLong = Integer.toUnsignedLong(signedInt); // 4294967295L
String unsignedString = Integer.toUnsignedString(signedInt); // "4294967295"

// 3. Арифметические операции с беззнаковой интерпретацией
int a = Integer.parseUnsignedInt("3000000000"); // OK, хотя > Integer.MAX_VALUE
int b = 1;
int compare = Integer.compareUnsigned(a, b); // Сравнение как беззнаковых
int divide = Integer.divideUnsigned(a, b);   // Деление как беззнаковых

Для работы с большими беззнаковыми числами:

  • Используйте long для значений до 2^64-1.
  • Используйте BigInteger для произвольно больших значений.

Битовые операции (&, |, ~, <<, >>>) работают идентично для знаковых и беззнаковых представлений, так как оперируют битами. Особенно полезен беззнаковый сдвиг вправо >>>.

int signed = -1;           // 0xFFFFFFFF
int afterShift = signed >>> 1; // 0x7FFFFFFF (2147483647) — старший бит заполняется нулем

Таким образом, хотя отдельные типы отсутствуют, необходимая функциональность для работы с беззнаковыми значениями в Java имеется.