Int без знака в Java - PullRequest
       27

Int без знака в Java

13 голосов
/ 15 декабря 2010

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

1 Ответ

16 голосов
/ 15 декабря 2010

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

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

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

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

например

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

РЕДАКТИРОВАТЬ: Почему это работает?Частично потому, что в 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.
...