按位NOT也称为1s 补码。
您可以通过加 1 将 1s 补码转换为2s 补码。
1s 补码和 2s 补码都是表示负数的不同方式,但现在几乎普遍使用 2s 补码。
因此,要否定 2s 补码形式的数字,您可以简单地应用按位 NOT 并加 1,即
-x == ~x + 1
相反,要将 2s 补码转换为 1s 补码,您可以将其取反并减去 1:
~x == -x - 1
请注意,正数在 1s 补码和 2s 补码表示中具有相同的表示 - 只有负数存在差异。例如对于 8 位整数:
Decimal 1s complement 2s complement
0 00000000 00000000
-0 11111111 n/a
1 00000001 00000001
-1 11111110 11111111
2 00000010 00000010
-2 11111101 11111110
127 01111111 01111111
-127 10000000 10000001
-128 n/a 10000000
请注意,1s 补码对十进制 0 有两种表示:+0 和 -0,而 2s 补码有唯一的零表示。2s 补码还可以表示 1s 补码中不可用的附加负值(在 8 位整数的情况下为 -128)。