程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 補碼的簡單探究

補碼的簡單探究

編輯:關於C語言

為了在計算機中表示負整數,有一些編碼方式添加了符號位來區別正整數與負整數。
可是,這樣一來,整數的加減運算變復雜了。


事實上,整數是一個整體,用符號位來區分正整數與負整數好像沒什麼必要。

補碼的思想可能是這樣來的——補碼可以看成是一種編碼方式,在這種編碼方式中,正整數的表示方法跟無符號數相同是很自然的,可是負數怎麼辦呢?
為了簡化這種編碼方式的加減運算,可以考慮把整數的減法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)),可以得到正確結果

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved