什麼是二補數計算機?
二補數計算機可在十進位、二進位與十六進位之間互相轉換,同時呈現電腦內部是如何表示負數的。二補數(Two's Complement)是現今幾乎所有處理器用來儲存有號整數的標準方法,因此無論是程式設計師、電子工程系學生,或任何接觸數位邏輯的人,都有必要徹底搞懂它。這款工具讓你以任何進位制輸入數值,挑選位元寬度(8、16 或 32 位元),就能即時看到二補數的表示法以及對應的十進位值。
計算機怎麼用?
- 在輸入欄位中填入你的數字——支援十進位、二進位或十六進位。
- 視需要選擇輸入值的進位制。
- 選定位元寬度:8 位元、16 位元或 32 位元。
- 查看結果:二進位、十六進位與有號十進位值會自動顯示出來。
位元寬度之所以重要,是因為它決定了可儲存的數值範圍。舉例來說,8 位元有號整數可表示 -128 到 127;16 位元則涵蓋 -32,768 到 32,767。
公式解析
要求出一個二進位數的二補數,只需兩個步驟:
- 把每個位元反相(0 變成 1,1 變成 0),這就是一補數(One's Complement)。
- 在結果上加 1。
最左邊的位元扮演符號位的角色:0 代表正數,1 代表負數。若要把負的十進位數轉成二補數,公式為 \(2^{n} + \text{數值}\),其中 \(n\) 為位元寬度。
$$\text{Twos Complement} = \left(\sim \text{Number}_{\,2}\right) + 1 \pmod{2^{\text{Bit Width}}}$$
實際範例
把 -5 轉換成 8 位元二補數:
- 先寫出 +5 的二進位:
0000 0101。 - 將各位元反相:
1111 1010。 - 加 1:
1111 1011。
因此 -5 會被儲存成 1111 1011,換算成十六進位即 FB。驗算一下:\(251 - 256 = -5\)(無號值)。
按位寬分類的有符號整數範圍
二補數是電腦表示有符號整數的標準方式。對於給定的位寬 \(n\),一個位元用作符號位元,因此可表示的有符號範圍是 \(-2^{n-1}\) 到 \(2^{n-1}-1\),而相同位元的無符號解釋涵蓋 \(0\) 到 \(2^{n}-1\)。所有算術運算都以模 \(2^{n}\) 進行換行。
| 位寬 \(n\) | 有符號最小值 \(-2^{n-1}\) | 有符號最大值 \(2^{n-1}-1\) | 無符號最大值 \(2^{n}-1\) | 模數 \(2^{n}\) |
|---|---|---|---|---|
| 8 | -128 | 127 | 255 | 256 |
| 16 | -32,768 | 32,767 | 65,535 | 65,536 |
| 32 | -2,147,483,648 | 2,147,483,647 | 4,294,967,295 | 4,294,967,296 |
| 64 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | 18,446,744,073,709,551,615 | 18,446,744,073,709,551,616 |
例如,十進位 5 在 8 位元形式中的二補數是 251(當作無符號位元組讀取時),它表示有符號值 \(-5\)。
常見 8 位元值的十進位-二進位-十六進位參考表
下表將代表性的有符號十進位值對應到其 8 位元二補數二進位和十六進位形式。負數的最高有效位設為 1。若要對值進行否定,請反轉所有 8 個位元並加 1。
| 有符號十進位 | 8 位元二進位 | 十六進位 | 無符號值 |
|---|---|---|---|
| -128 | 1000 0000 | 0x80 | 128 |
| -64 | 1100 0000 | 0xC0 | 192 |
| -5 | 1111 1011 | 0xFB | 251 |
| -1 | 1111 1111 | 0xFF | 255 |
| 0 | 0000 0000 | 0x00 | 0 |
| 1 | 0000 0001 | 0x01 | 1 |
| 5 | 0000 0101 | 0x05 | 5 |
| 64 | 0100 0000 | 0x40 | 64 |
| 127 | 0111 1111 | 0x7F | 127 |
若要獨立驗證二進位形式,您可以將 8 位元模式 11111011 轉換回十進位,作為無符號位元組等於 251(解釋為有符號時為 \(-5\))。
關鍵術語與定義
- 位寬
- 用於儲存整數的二進位數字個數(通常為 8、16、32 或 64)。它確定了模數 \(2^{n}\) 和可表示值的範圍。
- 符號位元
- 指示有符號數是負數(1)還是非負數(0)的單一位元。在二補數中,它是最高有效位。
- 最高有效位(MSB)
- 二進位數中最左邊、最高值的位元。在有符號二補數值中,MSB 兼作符號位元。
- 一補數
- 數字的按位反轉 — 每個 0 變成 1,每個 1 變成 0(\(\overline{B}\))。它是形成二補數前加 1 的中間步驟。
- 二補數
- 主要的有符號整數編碼:通過反轉所有位元並加 1 來否定值,即 \(\overline{B}+1 \pmod{2^{n}}\)。它給出零的單一表示法,並讓相同的硬體執行有符號和無符號數的加法。
- 溢位/換行
- 當結果超過位寬的可表示範圍時發生的情況;該值以模 \(2^{n}\) 進行換行。例如,將 8 位元最大值 127 加 1 會換行為 -128。
- 有符號與無符號整數
- 有符號整數可以使用二補數表示負數(範圍 \(-2^{n-1}\) 到 \(2^{n-1}-1\));無符號整數將每個位元模式視為非負數(範圍 \(0\) 到 \(2^{n}-1\))。位元相同 — 只有解釋方式不同。
常見問題
為什麼電腦要使用二補數?因為加法與減法可以共用同一套電路,而且零只有一種表示方式,不像符號數值法(sign-magnitude)或一補數那樣會出現兩種零。
如果我的數字超出位元寬度會怎樣?數值會溢位(overflow)並繞回(wrap around),產生出乎意料的結果。改用更寬的位元寬度即可避免這種情況。
怎麼轉換回一般的十進位?如果符號位是 1,就再取一次二補數並加上負號;如果符號位是 0,直接當成一般的二進位數來讀即可。