«Двойное дополнение» числа получается отрицанием, по крайней мере, на машинах, которые используют представление целых чисел с двойным дополнением, что справедливо почти для всех современных аппаратных средств и верно для виртуальной машины Java.
short x;
...set value of x...
x = -x;
В оборудовании с двумя дополнениями и в виртуальной машине Java отрицание эквивалентно инвертированию и добавлению единицы. Это демонстрирует следующее:
Пример:
public class Foo {
public static void main(String[] args) {
short n = 2; n = -n;
System.out.println(n);
short m = 2; m = ~m + 1;
System.out.println(m);
}
}
Выходные данные выше идентичны для m
и n
.
Если вы считаете необходимым использовать 32-битные значения для значения, вы можете просто замаскировать результат до 16 бит.
int uint16 = some_value;
int compl = -uint16 & 0xffff;