複製鏈接
請複製以下鏈接發送給好友

補碼

鎖定
計算機中的有符號數有三種表示方法,即原碼反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位,三種表示方法各不相同 [1]  。在計算機系統中,數值一律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理 [2] 
中文名
補碼
外文名
two's complement
所屬領域
計算機
作    用
存儲數值

補碼概念引入

在介紹補碼概念之前,先介紹一下“”的概念:“模”是指一個計量系統的計數範圍,如過去計量糧食用的鬥、時鐘等。計算機也可以看成一個計量機器,因為計算機的字長是定長的,即存儲和處理的位數是有限的,因此它也有一個計量範圍,即都存在一個“模”。如:時鐘的計量範圍是0~11,模=12。表示n位的計算機計量範圍是
,模=
.“模”實質上是計量器產生“溢出”的量,它的值在計量器上表示不出來,計量器上只能表示出模的餘數。任何有模的計量器,均可化減法為加法運算 [3] 
就是取反後加1。
假設當前時針指向8點,而準確時間是6點,調整時間可有以下兩種撥法:一種是倒撥2小時,即8-2=6;另一種是順撥10小時,8+10=12+6=6,即8-2=8+10=8+12-2(mod 12).在12為模的系統裏,加10和減2效果是一樣的,因此凡是減2運算,都可以用加10來代替。若用一般公式可表示為:a-b=a-b+mod=a+mod-b。對“模”而言,2和10互為補數。實際上,以12為模的系統中,11和1,8和4,9和3,7和5,6和6都有這個特性,共同的特點是兩者相加等於模。對於計算機,其概念和方法完全一樣。n位計算機,設n=8,所能表示的最大數是11111111,若再加1成100000000(9位),但因只有8位,最高位1自然丟失(相當於丟失一個模)。又回到了 00000000,所以8位二進制系統的模為
。在這樣的系統中減法問題也可以化成加法問題,只需把減數用相應的補數表示就可以了。把補數用到計算機對數的處理上,就是補碼 [3] 

補碼性質

以補碼定義式為基礎,沿數軸列出典型的真值原碼與補碼錶示,可清楚瞭解補碼的有關性質 [3] 
(1)在補碼錶示中,最高位
(符號位)表示數的正負,在形式上與原碼相同,即 0正 1負。但補碼的符號位是數值的一部分,由補碼定義式計算而得。例如,負小數補碼中
為 1,這個 1是真值
(負)加模 2後產生 [3] 
真值,原碼和補碼的關係 真值,原碼和補碼的關係
(2)在補碼錶示中,數 0只有一種表示,[+0]補 =[-0]補 =0.000……0 [3] 
(3)負數補碼錶示的範圍比原碼稍寬,多一種數碼組合。對於定點數,若為純小數,表示範圍為:
,若為純整數,表示範圍為:

補碼原碼求補碼

求給定數值的補碼分以下兩種情況:

補碼正數

正整數的補碼是其二進制表示,與原碼相同 [3] 
例:+9的補碼是00001001。(備註:這個+9的補碼是用8位2進制來表示的,補碼錶示方式很多,還有16位二進制補碼錶示形式,以及32位二進制補碼錶示形式,64位進制補碼錶示形式等。每一種補碼錶示形式都只能表示有限的數字。)

補碼負數

求負整數的補碼,將其原碼除符號位外的所有位取反(0變1,1變0,符號位為1不變)後加1 [4] 
同一個數字在不同的補碼錶示形式中是不同的。比如-15的補碼,在8位二進制中是11110001,然而在16位二進制補碼錶示中,就是1111111111110001。以下都使用8位2進制來表示。
例:求-5的補碼。
-5對應帶符號位負數5(10000101)→除符號位外所有位取反(11111010)→加 00000001為 (11111011)
所以-5的補碼是11111011。

補碼0的補碼

數0的補碼錶示是唯一 [3] 
[+0]補=[+0]反=[+0]原=00000000
[ -0]補=11111111+1=00000000

補碼補碼求原碼

已知一個數的補碼,求原碼的操作其實就是對該補碼再求補碼 [3] 
⑴如果補碼的符號位為“0”,表示是一個正數,其原碼就是補碼。
⑵如果補碼的符號位為“1”,表示是一個負數,那麼求給定的這個補碼的補碼就是要求的原碼。
例:已知一個補碼為11111001,則原碼是10000111(-7)。
解:因為符號位為“1”,表示是一個負數,所以該位不變,仍為“1”。
其餘七位1111001取反後為0000110;再加1,所以是10000111。

補碼特點

補碼具有如下特點: [5] 
1. 最高位為符號位,為0表示這個數是正數,為1表示這個數是負數。
2. 對於正數,[X]=[X],即正數的補碼與原碼相同,且能表示的數值範圍也相同。
3. 對於負數,補碼的值等於模減去該數的絕對值,負數的補碼等於該數的反碼加1。
4. 對於零,設n=8,則[+0]=00000000,[-0]=00000000,0的表示是唯一的,解決了+0和-0的表示問題。
5. 使用補碼錶示,可以將真值的減法運算變為機器中的加法運算,從而使CPU內部不再需要設計減法器,簡化了CPU的設計。

補碼意義

補碼“模”概念的引入、負數補碼的實質、以及補碼和真值之間的關係所揭示的補碼符號位所具有的數學特徵,無不體現了補碼在計算機中表示數值型數據的優勢,和原碼反碼等相比可表現在如下方面 [3] 
(1)解決了符號的表示的問題 [3] 
(2)可以將減法運算轉化為補碼的加法運算來實現,克服了原碼加減法運算繁雜的弊端,可有效簡化運算器的設計 [3] 
(3)在計算機中,利用電子器件的特點實現補碼和真值、原碼之間的相互轉換,非常容易 [3] 
(4)補碼錶示統一了符號位和數值位,使得符號位可以和數值位一起直接參與運算,這也為後面設計乘法器除法器等運算器件提供了極大的方便。總之,補碼概念的引入和當時運算器設計的背景不無關係,從設計者角度,既要考慮表示的數的類型(小數、整數、實數和複數)、數值範圍和精確度,又要考慮數據存儲和處理所需要的硬件代價。因此,使用補碼來表示機器數並得到廣泛的應用,也就不難理解了。 [3] 
參考資料
  • 1.    董濤. 淺析計算機數值編碼中的原碼、反碼與補碼[J]. 數字技術與應用, 2011(01):120-121.
  • 2.    柏剛, 程蘭. 關於二進制補碼運算如何解決溢出問題的研究[J]. 電腦知識與技術, 2016, 12(33):208-209.
  • 3.    楊學穎, 周建業. 計算機補碼概念探究[J]. 河南科技學院學報(自然科學版), 2011(03):95-99.
  • 4.    張美英. 負數補碼的表示方法[J]. 內蒙古電大學刊, 2001(04):47.
  • 5.    向繼文.基於課程體系的原碼、反碼和補碼教學研究[J].電腦知識與技術:學術版,2022,18(36):154-156159