資料表示法:位元、位元組與數值
符號數值法與一補數
/ wunz KOM-pluh-muhnt /
在二補數定案之前,工程師試過其他把負數塞進定寬模式的方法。其中兩種——符號數值法和一補數——如今已成歷史,但值得一瞥,因為它們顯示了「為什麼」二補數勝出,也因為它們的指紋仍留存在浮點格式和舊資料裡。
符號數值法是最直觀的想法:把最高位元純粹當成正負旗標,讓其餘位元保存數字的大小,就像在前面寫個負號。在 8 位元裡,0000 0101 是 +5,1000 0101 是 -5。它很直觀,但有兩個尷尬後果:有兩個零(正的 0000 0000 和負的 1000 0000),而且普通的二進位加法會給出錯誤答案,所以硬體需要特別處理。一補數把正數的每個位元翻轉來形成負數(所以 -5 是 0000 0101 的翻轉,即 1111 1010)。加法幾乎管用,但你必須把任何進位的溢出加回最低位(「循環進位」),而且它也有負零的毛病。
二補數本質上就是一補數再加一,而這一個額外步驟抹除了兩個問題:唯一的零,以及就是管用的普通加法。這就是為什麼你會程式設計的每一顆 CPU 都用二補數來表示整數。不過你仍會在一個重要的地方遇到符號數值法——IEEE-754 浮點數把符號存成獨立的最高位元,這正是為什麼浮點數同時有 +0.0 和 -0.0。
在 8 位元裡用三種方式表示 -5:符號數值法 1000 0101,一補數 1111 1010,二補數 1111 1011。只有二補數有唯一的零和乾淨的加法。
三種歷史方案;二補數(最後一種)勝出。
現代 C 自 C23 起才保證有號整數使用二補數;更早的標準允許三種都行,但你不會遇到一台用符號數值法或一補數來表示整數的真實機器。
又称
另见