為了在計算機中表示負整數,有一些編碼方式添加了符號位來區別正整數與負整數。
可是,這樣一來,整數的加減運算變復雜了。
事實上,整數是一個整體,用符號位來區分正整數與負整數好像沒什麼必要。
補碼的思想可能是這樣來的——補碼可以看成是一種編碼方式,在這種編碼方式中,正整數的表示方法跟無符號數相同是很自然的,可是負數怎麼辦呢?
為了簡化這種編碼方式的加減運算,可以考慮把整數的減法x-y轉換成加法x+(-y),用一個加法器來進行所有的加減運算,這裡其實給出了負數的編碼方法——如果這種運算方法是可行的,就會有x+(-x)=0,即可以用正數來定義負數。
假定用4位二進制來編碼,由於0010+1110=0000,於是-2的編碼是1110。類似的,可以給出其余負數的編碼。
整理一下思路,以這樣的方式進行編碼(8-bits)。
1) 正整數與無符號數的編碼相同(0~2^7-1)
2) 用0與正整數(1~2^7)的編碼來定義負整數的編碼,使得x+(-x)=0
由負整數的定義可以看出,負數的編碼是唯一的,同時值在2^7~2^8之間。
若x取反加1再加上自己,結果為0。x取反加1是唯一的,又由負整數的定義,負整數的編碼一定是存在的,於是x取反加1就是負整數的編碼。
可以證明這種編碼的加減運算可以用一個加法器實現。
假定有兩個正整數x與y(運算結果不溢出)。
1) x+y=x+y可以得到正確的結果
2) x+(-y),分類討論
a) 若x>y,由1)可以使x=y+(x-y),於是x+(-y)=(y+(x-y))+(-y)=(y+(-y))+ (x-y)= (x-y),可以得到正確結果
b) 若x<y,由a)可以使x=y+(-(y-x)),於是x+(-y)=(y+(-(y-x)))+(-y)=(y+(-y))+ (-(y-x))= (-(y-x)),可以得到正確結果
3) (-x)+(-y),由b)可以使 (-x)=y+(-(x+y)),於是(-x)+(-y)=(y+(-(x+y)))+(-y)=(y+(-y))+(-(x+y))=(-(x+y)),可以得到正確結果