一補碼與「雙重零」現象

One's Complement Visualizer

Created by Sam Li

課堂目標 (Learning Goals)

了解「一補碼」的簡單邏輯(0變1,1變0)。親自觀察它最大的致命傷:系統中同時存在「+0」和「-0」,這浪費了記憶體,也讓電腦的運算邏輯變得複雜。

十進制 (Decimal)
範圍: -127 至 127
8-bit 一補碼表示法
符號(-127)
 (64)
 (32)
 (16)
 (8)
 (4)
 (2)
 (1)

概念解析

如何計算一補碼?

非常直觀!正數的表示法與一般二進制無異。要得到負數,只需將對應正數的所有位元反轉(0變1,1變0)即可。也就是邏輯閘中的 NOT 運算。

+5 = 0000 0101
-5 = 1111 1010 (全部反轉)

一補碼的致命傷:雙重零

如果我們將 +0 (00000000) 的位元全部反轉,會得到 11111111。在數學上,這個值被定義為 -0。這在硬體設計上是個大麻煩,因為電腦在判斷「是否等於零」時,需要檢查兩種不同的情況!

常見迷思 (Common Misconceptions)

迷思 1:負數只是把最左邊的 Bit 改成 1?

這是一個常見的誤會!只改最左邊符號位的做法稱為「符號與大小 (Sign-Magnitude)」。在一補碼系統中,要把正數變成負數,必須反轉所有的位元,而不僅僅是第一位。

迷思 2:現在的電腦就是用一補碼?

不是的。因為一補碼會產生「雙重零 (-0 和 +0)」的問題,現代電腦普遍採用「二補碼 (Two's Complement)」。一補碼現在主要是作為學習二補碼的過渡概念,或是計算過程中的一步。

課堂總結 (Key Takeaways)

  • 📌 範圍縮小: 8-bit 的一補碼範圍是 -127 到 127。相比二補碼(可以去到 -128),它少了一個可用數字,因為那個位置留給了「-0」。
  • 📌 歷史意義: 雖然一補碼將「變負數」的操作簡化為最基礎的 NOT 邏輯閘,但為了解決「雙重零」的問題,我們才需要進階到二補碼(反轉後再 + 1)