過去學計算機組成原理時一直沒有搞明白補碼的意義,今天聽了王紅老師的數字電子基礎課才了解到,慚愧!
數制和碼制
在正文開始之前,首先要明確兩個概念,就是數制和碼制,
比如下面這個數字:
100832
他可能代表的是整型值十萬零八百三十二,這就是數制;但如果它代表的是郵政編碼,這就是碼制;
二進制補碼
帶符號二進制的運算依賴於補碼,如
+5: 0 0101
-5: 1 0101
最高位為0則為正,為1則為負。正常來講我們將其相加應該是0,但實際上:
00101
+10101
------
11010
直接相加得到的結果並不是我們想要的,這是因為哦這樣想加混淆了數制和碼制,最高位的0和1並不和地位一樣代表着數值,所以和它們一起直接計算必然就會出錯。
所以帶符號的二進制數的計算依賴於補碼,補碼的表示如下:
+5: 0 0101
-5: 1 1011
這里有幾個要解釋和注意的點:
-
補碼和原碼的轉換規則:正數補碼和原碼相同,負數的補碼為原碼的數值位取反加一、符號位不變
-
補碼的計算:
如-5的補碼為 11011,即\(-2^{4}+2^3+2^1+2^0=-16+8+2+1=-5\),即符號位代表了一個很大的負數值,足以糾正數制位的正數值。從這里也能理解為什么n位二進制補碼可以表達的范圍為\(-2^{n-1}...2^{n-1}-1\)
-
負數的補碼需要添位時直接往高位添1即可
-
符號位的處理:最終的符號位就是兩者符號位相加再加上上來的進位
-
考慮到結果的位數,要清楚的知道最后的范圍是多少,否則就會出錯。考慮5位補碼運算13+10:
0 1101 0 1010 ------- 1 0111=-7