什麼是二補數計算機?
二補數(Two's Complement)是電腦儲存有號整數的標準方式。這個計算機可以把任意十進位數字,依你選定的位元寬度(4、8、16 或 32 位元)轉換成二補數的二進位表示,並同時顯示這組位元被解讀為無號值(unsigned)與有號值(signed)時各自代表的數字。
使用方式
輸入一個十進位數字——正數或負數皆可——再選擇位元寬度即可。工具會將數字對 \(2^n\) 取模,產生出 CPU 實際會儲存的位元組合。它還會告訴你同一組位元解碼成有號值後會是多少,方便你來回驗證轉換是否正確。
公式說明
對一個 \(n\) 位元的欄位來說,無號表示法為
$$u = ((x \bmod 2^n) + 2^n) \bmod 2^n$$這道公式會讓負數「繞回去」:以 8 位元為例,-5 會變成 \(256 - 5 = 251\),其二進位為 \(11111011\)。若要把一組位元解碼回有號值,只要檢查最高有效位元(MSB):若它為 1(也就是 \(u \geq 2^{n-1}\)),則該值為 \(u - 2^n\);否則就直接是 \(u\)。另一種等效的取負方法,是把所有位元取反後再加一:\(\sim x + 1\)。
$$\text{Unsigned} = \left(\,\text{Decimal} \bmod 2^{\text{Bits}}\,\right),\qquad \text{Signed} = \begin{cases} \text{Unsigned} & \text{Unsigned} < 2^{\,\text{Bits}-1} \\[4pt] \text{Unsigned} - 2^{\text{Bits}} & \text{otherwise} \end{cases}$$
實際範例
把 −5 轉換成 8 位元的二補數。步驟一:\(2^8 = 256\)。步驟二:\(u = ((-5 \bmod 256) + 256) \bmod 256 = 251\)。步驟三:\(251\) 的二進位是 \(11111011\)。由於 MSB 為 1,其有號值即為 \(251 - 256 = -5\),正好驗證了轉換結果。
常見問題
如果我的數字超過位元寬度能容納的範圍怎麼辦? 它會對 \(2^n\) 取模並「繞回」(溢位),就跟硬體實際的行為一模一樣。例如 300 在 8 位元下會變成 \(300 - 256 = 44\)。
為什麼無號值和有號值不一樣? 同一組位元可以有兩種讀法。無號讀法把所有位元都當成正權重;有號讀法則把最高位元視為負權重。
支援 64 位元嗎? 為了讓結果維持在安全的精度範圍內,本工具目前支援到 32 位元等常見寬度。