1. 程式人生 > >計算機記憶體對數字的儲存方式——原碼、反碼、補碼

計算機記憶體對數字的儲存方式——原碼、反碼、補碼

計算機在儲存數字時,以最高位作為數值符號進行儲存,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. 先獲取原碼
  2. 正數的反碼就是原碼
  3. 負數的反碼,是在原碼的基礎上,符號位不變,其他位取反

如下,求得+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

運算結果正確!

嗯。