负值表示

Java 和大多数其他语言在称为 2 的补码表示法的表示中存储负整数。

对于使用 n 位的数据类型的唯一二进制表示,值的编码如下:

最不重要的 n-1 比特以积分表示存储正整数 x。最重要的价值存储有点价值 s。这些位重现的值是

x - s * 2 n-1

即,如果最高有效位为 1,则减去比你用其他位( ) 表示的数字大 1 的值,允许每个值的唯一二进制表示 - 2 n-1 (s = 1) ; x = 0)至 2 n-1 -1(s = 0; x = 2 n-1 -1)。 2 n-2 + 2 n-3 + ... + 2 1 + 2 0 = 2 n-1 - 1

这也有很好的副作用,你可以添加二进制表示,就好像它们是正二进制数:

v1 = x1 - s1 * 2n-1
v2 = x2 - s2 * 2n-1

请注意,这一事实使得查找加法逆的二进制表示(即负值)变得容易:

注意,向数字添加按位补码会导致所有位都为 1.现在加 1 使值溢出,得到中性元素 0(所有位 0)。

所以数字 i 的负值可以使用(忽略这里可能的推广到 int)来计算

(~i) + 1

示例: 取负值 0(byte):

否定 0 的结果是 11111111。添加 1 给出 100000000(9 位)的值。因为 byte 只能存储 8 位,所以最左边的值被截断,结果是 00000000

原始的 处理 结果
0(00000000) 取负值 -0(11111111)
11111111 将 1 添加到二进制 亿
100000000 截断为 8 位 00000000(-0 等于 0)