進位轉換與二補數工具

輸入數值並選擇輸入的進位與位元寬度,即可一次看到它的二進位、八進位、十進位與十六進位表示。負數以二補數表示,並同時顯示同一個位元串以無號與有號方式解讀的值、可表示的範圍、全部位元反轉與正負號反轉的結果。也適合在手算數值表示的練習題之後,用來核對答案。

輸入

結果

二進位
–
十六進位
–
八進位
–
十進位(無號)
–
十進位(二補數有號)
–

正負號反轉

全部位元反轉(一補數)
–
反轉後加 1(二補數)
–

此位元寬度可表示的範圍

無號的範圍
–
有號的範圍
–

負數以所選位元寬度的二補數表示,輸入中的空白與 _ 會被忽略。

轉換為二進位、八進位、十六進位的方法

要把十進位轉為二進位,就反覆除以 2,再把餘數由最後一個往回排列。反過來要把二進位轉為十進位,則將每一位乘上 1、2、4、8…的權重後相加。因為 16 是 2 的 4 次方,把二進位從低位開始每 4 位分成一組,每一組正好對應十六進位的一位數(0~9 與 A~F);八進位則是每 3 位一組。預設值 −5 以 8 位元表示為 1111 1011,1111 是 F、1011 是 B,因此十六進位為 0xFB,以無號十進位解讀則是 128 + 64 + 32 + 16 + 8 + 2 + 1 = 251。若每 3 位分成 011 111 011,八進位就是 373。本工具將二進位與十六進位每 4 位分組顯示,方便對照兩者的對應關係。

二補數與「反轉後加 1」的意義

在 n 位元的二補數中,負數 −x 以 2ⁿ − x 的位元串來表示。將所有位元反轉所得的值(一補數)是 (2ⁿ − 1) − x,再加 1 就正好等於 2ⁿ − x。這就是「反轉後加 1」能讓正負號相反的原因。8 位元的 5 是 0000 0101,反轉後為 1111 1010,加 1 後為 1111 1011,與 256 − 5 = 251 一致。以 2ⁿ 為模數運算的加法器中,加上 2ⁿ − x 與減去 x 的結果相同,因此減法也能用加法器完成,無號數與有號數也能共用同一個電路。工具的「正負號反轉」欄會顯示預設值 −5(1111 1011)反轉後的 0000 0100,以及加 1 後的 0000 0101(+5)。

可表示的範圍,以及 −128 反轉後仍是自己的不對稱性

n 位元的無號整數可表示 0 到 2ⁿ − 1,二補數的有號整數可表示 −2ⁿ⁻¹ 到 2ⁿ⁻¹ − 1。8 位元為 0~255 與 −128~127,16 位元為 0~65535 與 −32768~32767,32 位元為 0~4294967295 與 −2147483648~2147483647。0 位於最高位元為 0 的那一側,因此正數比負數少一個,最小的負數無法反轉正負號。以 8 位元輸入 −128(1000 0000),反轉後為 0111 1111,加 1 後又回到 1000 0000,可在工具中確認它仍是 −128。程式中對最小值取絕對值或乘以 −1 時會發生溢位,就是這個不對稱性造成的。

同一位元串的兩種解讀方式與符號擴展

位元串本身不帶有正負號的資訊,以無號或二補數解讀,得到的值就不同。最高位元為 0 時兩者相同;為 1 時,有號的值等於無號的值減去 2ⁿ。1111 1011 以無號解讀為 251,以有號解讀為 251 − 256 = −5。擴大有號數的位元寬度時,要把最高位元複製到所有新增的高位(符號擴展):−5 在 16 位元為 FFFB,在 32 位元為十六進位的 FFFF FFFB,值仍是 −5。若改以 0 填滿高位(零擴展),則成為 00FB,也就是 251。在工具中維持十進位 −5 並改變位元寬度,可看到符號擴展的結果;輸入十六進位 FB 再改變位元寬度,則可看到零擴展的結果。

加法的溢位與考題中的常見題型

n 位元的加法結果是除以 2ⁿ 的餘數,超出的高位會被捨棄。無號加法中,從最高位元向外產生進位(carry)時就是溢位;有號加法中,兩個正數相加得到負數,或兩個負數相加得到正數時才是溢位。以 8 位元輸入 127 + 1 的結果 128,位元串為 1000 0000,以無號解讀是 128,以有號解讀卻是 −128。以 32 位元輸入十進位 −1,無號值為 4294967295,與 C 語言中 32 位元無號整數計算 0 − 1 的結果相同。進位轉換、以二補數表示的負數、n 位元可表示的範圍與位移運算,都是計算機概論與資訊類證照考試的基本題型。輸入超出範圍的值時,本工具只保留低位元並顯示警告,可藉此確認暫存器中實際發生的情形。

練習電腦算術題目

將8位元有號整數 −8(1111 1000)以算術右移向右移1位元的結果為下列何者?

  1. A124(0111 1100)
  2. B−16(1111 0000)
  3. C−4(1111 1100)
查看答案與解析

正確答案:C. −4(1111 1100)

在算術位移(算術右移)中,空出來的最高位元會複製符號位元,因此 1111 1000 會變成 1111 1100,以二補數而言就是 −4。即使是負數,向右移1位元也會成為除以2的值。若是在最高位填入0的邏輯右移,則會成為 0111 1100 = 124,符號就改變了。−16則是向左移1位元的結果。另須注意,在C語言中將負的有號整數右移時會是哪一種,屬於實作定義(交由編譯系統決定)。

在C語言中,32位元無號整數(unsigned int)的 0 減去 1 的結果為下列何者?

  1. A−1
  2. B4294967295
  3. C維持0不變
查看答案與解析

正確答案:B. 4294967295

無號整數沒有負數,C語言規定結果以除以 2³² 的餘數處理(繞回)。0 − 1 會成為 2³² − 1 = 4294967295,其位元串全為1。因此,若在無號變數上將「每次減1直到i成為0」的迴圈寫成 i >= 0,條件會恆為真而永遠無法結束。無號數無法表示 −1,也不會停在0(飽和)。

在無號整數彼此的加法中,判定結果超過可表示範圍(位數溢出)的方法,下列何者正確?

  1. A查看結果的最高位元是否為1
  2. B查看兩個輸入的最高位元是否相等
  3. C查看從最高位元是否有進位溢出到外部
查看答案與解析

正確答案:C. 查看從最高位元是否有進位溢出到外部

在無號數的加法中,當從最高位元再向上產生進位時,結果就超過了該位元數所能表示的最大值。在CPU中,這個進位會留作進位旗標(carry flag),檢查它即可判定。結果的最高位元為1,只是變成了較大的數,並非位數溢出。比較進位到最高位元與從最高位元進位的差異,是有號數的溢位判定方法。

常見問題

−5 以 8 位元二補數表示是多少?

5 以 8 位元表示為 0000 0101。將所有位元反轉得到 1111 1010,再加 1 得到 1111 1011,十六進位為 0xFB,以無號解讀為 251。用 256 − 5 = 251 計算也會得到相同的位元串。

二進位轉十六進位有什麼簡單的方法?

從低位開始每 4 位分成一組,再把每一組換成 0~9、A~F 中的一位數。例如 1011 0110 中,1011 是 B、0110 是 6,所以是 B6。位數不是 4 的倍數時,先在高位補 0 再分組。轉換為八進位時則每 3 位一組。

為什麼 8 位元有號整數的範圍是 −128~127?

8 位元共有 256 種組合,其中最高位元為 1 的 128 種分配給負數(−128~−1),最高位元為 0 的 128 種分配給 0 與正數(0~127)。由於 0 佔用了非負數那一側的一個位置,因此無法表示 +128。一般而言,n 位元可表示 −2ⁿ⁻¹ 到 2ⁿ⁻¹ − 1。

一補數與二補數有什麼不同?

一補數只是把所有位元反轉,會出現 +0(0000 0000)與 −0(1111 1111)兩個零,加法時還需要把最高位的進位加回最低位(循環進位)。二補數是反轉後再加 1,零只有一個,並能與無號數共用同一個加法器。因此,目前一般的電腦都以二補數表示整數。

十六進位的 FF 以無號和有號解讀分別是多少?

在 8 位元下,以無號解讀為 255,以二補數有號解讀為 −1。同樣的 FF 若以 16 位元輸入,會成為 00FF,即使以有號解讀也是 255。值是多少,取決於位元寬度以及是否以有號方式解讀。

相關名詞

二補數 符號擴展 算術位移 全加器 飽和運算 條件碼 立即值 INT8

相關計算工具

半導體、電子電路與資訊計算工具 →