Я пытаюсь реализовать существующий сетевой протокол, который активно использует типы данных Unsigned, которые не поддерживаются Java. Что я сейчас делаю, так это для каждого типа данных выбираю следующий больший, чтобы беззнаковое число могло поместиться в положительную область, а затем использую сдвиг байтов для получения желаемого эффекта. Поскольку это довольно подвержено ошибкам, и для unsigned long вперед мне приходится использовать BigInteger, который намного тяжелее, чем расширенные типы, мне было интересно, нет ли лучшего способа добиться этого?
Целое число без знака в Java
Ответы (1)
В зависимости от того, что вы делаете, вы можете просто рассматривать long как 64-битное значение, а int как 32-битное значение. Большинство операций esp readInt/Long writeInt/Long работают точно так же, игнорируя знак.
Можете ли вы привести пример операции, которую вы выполняете с этими числами, и, возможно, мы можем предложить, как сделать то же самое, не расширяя тип.
Например, ++, --, +, -, *, ==, !=, ‹‹ работают одинаково независимо от знака (т. е. дают один и тот же ответ). вместо >> можно заменить >>>
Это /, %, >, >=, ‹, ‹= и функции печати, которые принимают значения со знаком, но вы должны иметь возможность обойти их (если вы их используете).
e.g.
long unsignedA =
long unsignedB =
boolean greater = unsignedA + Long.MIN_VALUE > unsignedB + Long.MIN_VALUE
РЕДАКТИРОВАТЬ: Почему это работает? Отчасти потому, что в java нет исключений переполнения/недополнения.
e.g.
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.
>>>
для смещения битов без знака.
- person Peter Lawrey; 06.03.2013