負值表示

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)