负值表示
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) |