1. 程式人生 > >為什麼計算機以補碼形式儲存

為什麼計算機以補碼形式儲存

  大家都直到,在計算機中主要是以補碼的形式儲存,那麼為什麼二進位制數在原碼、反碼、補碼中選擇以補碼的形式儲存呢?

一、為什麼不以原碼形式儲存?

  首先,原碼是站在使用者角度的,是原始的二進位制!

求原碼:

    1.使用者的數字分為正負數,需要有一位儲存符號

    2.最高位為符號位:0為正,1為負

    3.左邊是高位,右邊是低位

由原碼的計算方式可以發現原始碼儲存會引發2個問題:

  1. 0有兩個儲存方式

         我們以char型(佔1位元組,8位)為例(下同):

                            +0:    0000 0000

                             -0:    1000 0000

          不難發現+0和-0的原碼是不一樣的,而在計算過程中,+0和-0是沒有任何區別的。

   2. 正數和負數相加,結果不正確(計算機只會加)

         1 - 1 =1 + (-1)

          1:  0000 0001

        -1:  1000 0001

                 1000 0010  =  -2

       很顯然1-1=0,而用原碼進行計算得出的結果卻相差甚遠!

二、為什麼不以反碼形式儲存?

 既然原碼不適合作為計算機的儲存方式,人們在解決這個問題的過程中又提出了反碼的概念

求反碼:

  1. 求原碼
  2. 符號為不變,其他位取反

注意:正數原碼、反碼一樣!

  • 接下來我們檢驗一下1 - 1:

        1:    0000 0001

     -  1:   1111 1110

                 1111 1111 ->1000 000(轉換為原碼,因為原碼是站在使用者角度的) = -0

       不難可能出反碼已經解決的正負數相加結果不正確的問題

  •    然後我們再檢驗+0、-0

              +0  0000 0000

               -0  1111 1111

        由此看出,反碼並沒有解決0有兩種形式的問題

碼儲存會引發1個問題:

  1. 0有兩個儲存方式

三、補碼儲存

  在反碼的基礎上,人們有提出了補碼的概念

求補碼:

  1.    補碼為其反碼+1

注意:正數的原碼、反碼、補碼都一樣!

接下來我們對補碼儲存進行驗證:

    +0: 0000 0000

     -0: 原碼:  1000 0000

             反碼:  1111 1111

             補碼:1 0000 0000(char佔1位元組八位,最高位丟棄)= 0000 0000

 可以看出補碼解決了+0 -0不一樣的問題

    +1: 0000 0001

     -1: 1111 1111 

          1 0000 0000(最高位丟棄)=0000 0000 = 0

 那麼補碼也解決了正負數相加結果不正確的問題! 

總結:

     補碼是在原碼的基礎上為了適應計算機運算一步一步完善而來,原碼和反碼儲存都有一定的弊端,因此計算機採用補碼儲存!