文章目錄
- 補碼的理解
- 十進制計算
- 二進制計算
- 補碼和真值換算
- 數制轉換
- 負數補碼轉真值
- 負數真值轉補碼
注:均來自 做而論道 答主的理解。
補碼的理解
在計算機系統中,根本就沒有原碼和反碼,真值也是不存在的。在計算機系統中,并不使用原碼和反碼,數值(也就是真值),一律采用補碼表示和存儲。補碼、真值都和原碼、反碼毫無關系。
補碼,其實是一個“代替負數”進行運算的正數。采用了補碼之后,計算機中就沒有負數了,也消除了減法運算。利用補碼,可以簡化算法,從而就能簡化硬件。
補碼(即正數)能代替負數,根源在于“計數系統的周期性”。
十進制計算
如果使用 2 位 10 進制數(0~99),計數周期就是 10^2 = 100。此時,就可以有:
25-1 = 24
和25 + 99 = (一百) 24
舍棄進位,只取兩位數,這兩種算法,功能就完全相同。
+99,就能代替-1。+98,也可以代替-2。這些“代替負數的正數”,就可稱為“負數的補數”。
關系式:補數 = 負數 + 10^n。(n 是補數的位數。10^n 是 n 位數的計數周期)。
二進制計算
這個關系式,補數 = 負數 + 10^n,在計算機中,也可以使用。
8 位 2 進制:0000 0000~1111 1111 (十進制 255)。
它們的計數周期是:2^8 = 256。
計算機用二進制補數就改稱為補碼。
求負數補碼的計算公式也是: 補碼 = 負數 + 周期。
-1
補碼就是:-1+256=255=1111,1111
。
-2
的補碼是: 254 = 1111,1110
。
正數,不可轉換,必須直接參加運算。所以,零和正數,并不存在補碼。
計算機中的運算,也就是一些“二進制數”的運算,與人類使用的十進制數的運算,并沒有多少的差異。“二進制數”的運算,根本就不需要格外的證明!!!
而且,“符號位原碼反碼取反加一符號位不變”,并沒有理論依據。
補碼和真值換算
知道補碼,求真值,方法步驟,是非常簡單的。既不用求“反碼原碼”,也不用想著“符號位不變”。“取反加一”或“減一取反”,都是不需要的。
直接進行數制轉換即可。
數制轉換
補碼的首位,既是符號位,也代表數值。
如果是八位補碼,首位 1 就是-128。
如果是 16 位補碼,首位 1 就是-32768。
其余數值位都是正數。加在一起,就是真值。
負數補碼轉真值
有一個八位的補碼,是 1000,1110
。
首位 1
,既代表負數,也代表-128
。其余都是正數:8+4+2=+14
。求總和,故其真值就是:-114
。
另一個八位的補碼,是0000,1110
。其真值就是:8+4+2=+14
。
負數真值轉補碼
求負數的補碼,方法是:[X]補=模+該負數。用不著原碼反碼。
-125
的補碼:先確定首位是1
,即-128
。數值位,那就是3
了。所以,[-125]補,就是 1000,0011
。
完全用不著"原碼反碼取反加一符號位不變 … "。
求-X 的補碼,你就用二進制減法算一下“0-X”,很輕松的。求負數的補碼,就是這么簡單!
數值 0,存入到一個字節中,就是0000,0000
。-1,你存入什么呢?顯然是0-1
。
用二進制計算0-1
,相減的結果,存到一個字節中,就是1111,1111
。1111,1111
就是-1
的補碼。