計算機記憶體對數字的儲存方式——原碼、反碼、補碼
阿新 • • 發佈:2019-01-08
計算機在儲存數字時,以最高位作為數值符號進行儲存,0表示正數,1表示負數,同時,計算機的最小儲存單位是8位
原碼
所謂原碼,就是將數值轉化為二進位制,如下將1、-1、0轉為二進位制
+1: 0000 0001
-1: 1000 0001
+0: 0000 0000
-0: 1000 0000
如上,如果計算機使用原碼進行儲存數值,將會導致有兩種0的結果。
此時計算1 - 1的結果:
// 以原碼計算1 - 1
1 - 1 = 1 + (-1)
+1: 0000 0001
-1: 1000 0001
1000 0010 => -2
以上,發現以原碼的方式儲存除了會導致有兩種0之外,連計算結果都不準確。因此,雖然原碼更容易被人理解,但對於計算機來說,反而不好處理。
反碼
反碼是為了補碼而產生的
- 先獲取原碼
- 正數的反碼就是原碼
- 負數的反碼,是在原碼的基礎上,符號位不變,其他位取反
如下,求得+1、-1、+0、-0的反碼
+1: 0000 0001 //正數的反碼與原碼相同
-1: 1111 1110
+0: 0000 0000
-0: 1111 1111
如上,此時0依然有兩種形式,此時計算1 - 1
// 以反碼計算1 - 1
+1: 0000 0001
-1: 1111 1110
1111 1111 => -0
以上,發現以反碼進行計算,計算結果正確,但是反碼依然有缺陷,它還是有兩種形式的0存在。
補碼
獲取原碼
獲取反碼
正數的原碼、反碼、補碼都是一致的
負數的補碼,在反碼的基礎上+1
如下,求得+1、-1、+0、-0的補碼
+1: 0000 0001
-1: 1111 1111
+0: 0000 0000
-0:10000 0000
如上,發現-0的補碼為10000 0000
,由於計算機的儲存單位是8位,所以超過8位的高位部分將被丟棄,所以,真正的-0的補碼為0000 0000
,與+0是一致的!
所以,補碼的方式解決了存在兩種0的問題,下面再看看補碼的情況下,計算結果是否正確
+1: 0000 0001
-1: 1111 1111
10000 0000 => 丟棄高位,最終結果為0000 0000,即0
運算結果正確!
嗯。