原碼,反碼,補碼。爲什麼需要三種碼?計算機實際存儲的都是補碼。
因爲符號位!所以做加法直接用補碼相加,正數的反碼和補碼就是原碼本身。負數的反碼即字面意思,符號位不變,其他各位取反。負數的補碼是反碼+1。
還原:負數的反碼還原爲原碼很簡單,符號位不變,其他位取反。負數的補碼還原爲原碼爲:符號位不變,其他位取反再+1。即補碼的補碼就是原碼。
例:含符號位4位 mod8
-5的補碼是-3,-3的補碼是-5。因爲-5和3同餘:
-5 = -1×8 + 3
3 = 0×8 + 3
那麼計算5-5按照反碼計算爲0101+1010=1111,需要加1進位置0。
計算1-5按照補碼計算:0001+1011=1100,還原爲補碼,1100=-4。
~取反
取反是包括符號位都要取反。當然也是對補碼取反,因爲計算機存儲的負數都是補碼。
例:含符號位8位,mod128
-10 的原碼1000 1010,補碼1111 0110取反得0000 1001,求原碼0000 1001。即9
10的原碼0000 1010,補碼0000 1010取反得1111 0101,求原碼0000 1011。即-11