Ответ
Нет, в 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 имеется.