Unsigned Int в Java

Я пытаюсь реализовать существующий сетевой протокол, который сильно использует типы данных Unsigned, которые не поддерживаются Java. То, что я сейчас делаю для каждого типа данных, выбрал следующий более крупный, чтобы беззнаковое число могло вписаться в положительную область, а затем использовать смещение байта, чтобы получить желаемый эффект. Поскольку это довольно распространенная ошибка, и для unsigned long forward я должен использовать BigInteger, который намного тяжелее, чем расширенные типы, мне было интересно, нет ли лучшего способа достичь этого?

Ответ 1

В зависимости от того, что вы делаете, вы можете просто долго обрабатывать 64-битное значение и int как 32-битное значение. Большинство операций esp readInt/Long writeInt/Long работают одинаково, игнорируя знак.

Можете ли вы привести пример операции, которую вы выполняете на этих числах, и, возможно, мы можем предложить, как сделать то же самое, не расширяя тип.

Например, ++, -, +, -, *, ==,! =, < < все работают одинаково независимо от знака (т.е. дают тот же ответ). для → вы можете подменить → >

Это/,%, > , > =, <, <= и функции печати, которые принимают значения со знаком, но вы должны иметь возможность обойти их (если вы используете их).

например.

long unsignedA = 
long unsignedB = 
boolean greater = unsignedA + Long.MIN_VALUE > unsignedB + Long.MIN_VALUE

EDIT: Почему это работает? Отчасти потому, что у java нет исключений переполнения/недогрузки.

например.

byte unsignedA = 0;
unsignedA--; 
// unsignedA == FF, is this -1 or 255? Java assumes the former but you assume the later

byte unsignedB = unsignedA * unsignedA;
// unsignedB is -1 * -1 = 1 or (byte) (255*255) = (byte) 65525 = 1.