什麼是二補數計算機?
二補數(Two's complement)是電腦用固定位元數表示有號整數的標準方式。這個計算機會接收一個十進位數字與 n 位元的暫存器寬度,接著顯示該數值如何以二補數位元樣式儲存、這些位元代表的無號值,以及這串位元被解讀為有號數時的意義。無論輸入正數或負數都適用。
如何使用
輸入你想編碼的十進位數值,並選擇位元數(常見為 8、16、32)。計算機會以模運算把數值收進 n 位元的暫存器中,顯示其二進位表示,並解碼出對應的有號數意義。負數會自動以二補數形式儲存。
公式說明
要把數值 \(x\) 儲存進 \(n\) 位元,可用下式計算儲存的(無號)位元樣式:
$$\text{stored} = \left(\left(x \bmod 2^{n}\right) + 2^{n}\right) \bmod 2^{n}$$某個儲存值的二補數(取負運算)為 \(\text{twos} = \left(2^{n} - \text{stored}\right) \bmod 2^{n}\)。若要解碼一串 \(n\) 位元樣式的有號意義:當該樣式大於或等於 \(2^{n-1}\) 時,數值為 \(\text{pattern} - 2^{n}\)(負數);否則就是該樣式本身。
實際範例
以 8 位元編碼 -5。此時 \(2^{8} = 256\),所以 \(\text{stored} = \left(\left(-5 \bmod 256\right) + 256\right) \bmod 256 = 251\)。換算成二進位,\(251 = 11111011\)。解碼 251:由於 \(251 \ge 2^{7}\)(128),其有號數值為 \(251 - 256 = -5\)。251 的二補數則為 \(\left(256 - 251\right) \bmod 256 = 5\),正好對應其絕對值。
常見問題
為什麼負數看起來像一大串二進位 1? 因為前導位元是 1;在 \(n\) 位元有號運算中,前導 1 代表這是負數,所以 11111011 表示 -5,而非 251。
n 位元能表示的範圍是多少? 有號數值範圍為 \(-2^{n-1}\) 到 \(2^{n-1} - 1\)。以 8 位元為例就是 -128 到 127。
如果我的數字太大怎麼辦? 超出暫存器範圍的數值會透過模運算繞回(溢位),運作方式與真實硬體完全一致。