Это более старый вопрос, и Пэт кратко упомянул char, я просто подумал, что я должен расширить это для других, которые будут смотреть на это в будущем. Давайте подробнее рассмотрим примитивные типы Java:
byte
- 8-разрядное целое число со знаком
short
- 16-разрядное целое число со знаком
int
- 32-разрядное целое число со знаком
long
- 64-разрядное целое число со знаком
char
- 16-разрядный символ (целое число без знака)
Хотя char
не поддерживает unsigned
арифметику, по сути ее можно рассматривать как unsigned
целое число. Вам бы пришлось явным образом привести арифметические операции обратно в char
, но он дает вам возможность указать unsigned
чисел.
char a = 0;
char b = 6;
a += 1;
a = (char) (a * b);
a = (char) (a + b);
a = (char) (a - 16);
b = (char) (b % 3);
b = (char) (b / a);
//a = -1; // Generates complier error, must be cast to char
System.out.println(a); // Prints ?
System.out.println((int) a); // Prints 65532
System.out.println((short) a); // Prints -4
short c = -4;
System.out.println((int) c); // Prints -4, notice the difference with char
a *= 2;
a -= 6;
a /= 3;
a %= 7;
a++;
a--;
Да, нет прямой поддержки целых чисел без знака (очевидно, мне не пришлось бы преобразовывать большинство моих операций обратно в char, если бы была прямая поддержка). Тем не менее, безусловно, существует неподписанный примитивный тип данных. Мне бы тоже хотелось увидеть неподписанный байт, но я думаю, что удвоение стоимости памяти и использование вместо char - жизнеспособный вариант.
Редактировать
В JDK8 появились новые API для Long
и Integer
, которые предоставляют вспомогательные методы при обработке значений long
и int
как значений без знака.
compareUnsigned
divideUnsigned
parseUnsignedInt
parseUnsignedLong
remainderUnsigned
toUnsignedLong
toUnsignedString
Кроме того, Guava предоставляет ряд вспомогательных методов для выполнения аналогичных действий для целочисленных типов, что помогает сократить разрыв, оставленный отсутствием встроенной поддержки для unsigned
целых чисел.