Вопрос-ответ

Declaring an unsigned int in Java

Объявление unsigned int в Java

Есть ли способ объявить unsigned int в Java?

Или вопрос также может быть сформулирован следующим образом: каков Java-эквивалент unsigned?

Просто чтобы рассказать вам о контексте, я рассматривал реализацию Java String.hashcode(). Я хотел проверить возможность столкновения, если целое число равно 32 unsigned int .

Переведено автоматически
Ответ 1

В Java нет типа данных для целых чисел без знака.

Вы можете определить a long вместо an int, если вам нужно хранить большие значения.

Вы также можете использовать целое число со знаком, как если бы оно было без знака. Преимущество представления дополнения two заключается в том, что большинство операций (таких как сложение, вычитание, умножение и сдвиг влево) идентичны на двоичном уровне для целых чисел со знаком и без знака. Однако некоторые операции (деление, сдвиг вправо, сравнение и приведение) отличаются. Начиная с версии Java SE 8, новые методы в Integer классе позволяют полностью использовать int тип данных для выполнения беззнаковой арифметики:


В Java SE 8 и более поздних версиях вы можете использовать тип данных int для представления 32-разрядного целого числа без знака, которое имеет минимальное значение 0 и максимальное значение 2^32-1. Используйте класс Integer для использования типа данных int в качестве целого числа без знака. Статические методы, такие как compareUnsigned, divideUnsigned и т.д., были добавлены в класс Integer для поддержки арифметических операций с целыми числами без знака.


Обратите внимание, что int переменные по-прежнему имеют знак при объявлении, но теперь возможна беззнаковая арифметика с использованием этих методов в Integer классе.

Ответ 2

Является ли значение в int подписанным или неподписанным, зависит от того, как интерпретируются биты - Java интерпретирует биты как значение со знаком (в нем нет беззнаковых примитивов).

Если у вас есть int, который вы хотите интерпретировать как значение без знака (например, вы читаете int из DataInputStream, которое, как вы знаете, должно интерпретироваться как значение без знака), то вы можете выполнить следующий трюк.

int fourBytesIJustRead = someObject.getInt();
long unsignedValue = fourBytesIJustRead & 0xffffffffL;

Примечание: важно, чтобы шестнадцатеричный литерал был long литералом, а не int буквой - отсюда "L" в конце.

Ответ 3

Нам нужны были числа без знака для моделирования unsigned в MySQL TINYINT, SMALLINT, INT BIGINT в jOOQ, поэтому мы создали jOUU, минималистичную библиотеку, предлагающую типы-оболочки для целых чисел без знака в Java. Пример:

import static org.joou.Unsigned.*;

// and then...
UByte b = ubyte(1);
UShort s = ushort(1);
UInteger i = uint(1);
ULong l = ulong(1);

Все эти типы расширяются java.lang.Number и могут быть преобразованы в примитивные типы более высокого порядка и BigInteger. Надеюсь, это поможет.

(Отказ от ответственности: я работаю в компании, стоящей за этими библиотеками)

Ответ 4

Для чисел без знака вы можете использовать эти классы из библиотеки Guava:

Они поддерживают различные операции:


  • plus

  • минус

  • раз

  • mod

  • разделеНо на

На данный момент, кажется, не хватает операторов сдвига байтов. Если они вам нужны, вы можете использовать BigInteger из Java.

java