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