計算機爲什麼要使用補碼計算?

今天無意中翻看大學的筆記,看到一個問題:通用計算機爲什麼使用二進制補碼做數學運算?畢業這麼多年了,被這個問題給折騰了一下,估計工作N年的人猛地你問他這個問題,他一定會回答沒有什麼原因,因爲用補碼,所以用補碼;偏偏我不是那樣的人,簡單的問題能解釋明白,也不容易;一下是總結:

---------------------------------------------------------------------------

0.爲什麼要使用補碼計算
  解決了有符號類型的加減運算
 
eg:1+(-2)
(1)如果用原碼計算存儲
      1+(-2)我們知道結果是-1
      1 =0000 0001 -2=1000 0010 相加 1000 0011 (顯然不是-1)
(2)使用補碼運算
      1 原碼=反碼=補碼=0000 0001   -2:原碼=1000 0010 反碼=1111 1101 補碼=1111 1110
      1(補碼)+(-2)(補碼)=1111 1111(補碼)  原碼爲1000 0001(-1)(正確)
 

1.總的概念
  數在計算機中是以二進制形式表示的;
  數分爲有符號數和無符號數;
  原碼、反碼、補碼都是有符號定點數的表示方法;
  無符號數全部按正數處理;
  一個有符號定點數的最高位爲符號位,0是正,1是負;


2.反碼,補碼定義
  正數:
  原碼=反碼=補碼
  
  負數:
  原碼
  反碼=其原碼除符號位之外的各位求反
  補碼=反碼+1  (如果+1之後有進位的,要一直往前進位,包括符號位)


3.運算示例
  正零:00000000
  負零:10000000
  這兩個數其實都是0,但他們的原碼卻有不同的表示。
  但是他們的補碼是一樣的,都是00000000
  特別注意,如果+1之後有進位的,要一直往前進位,包括符號位!(這和反碼是不同的!)
  [10000000]補
  =[10000000]反+1
  =11111111+1
  =(1)00000000
  =00000000(最高位溢出了,符號位變成了0)
  
  有人會問
  10000000這個補碼錶示的哪個數的補碼呢?
  其實這是一個規定,這個數表示的是-128
  所以n位補碼能表示的範圍是
  -2^(n-1)到2^(n-1)-1
  比n位原碼能表示的數多一個
  又例:
  1011
  原碼:01011
  反碼:01011 //正數時,反碼=原碼
  補碼:01011 //正數時,補碼=原碼
  
  -1011
  原碼:11011
  反碼:10100 //負數時,反碼爲原碼取反
  補碼:10101 //負數時,補碼爲原碼取反+1
  
  0.1101
  原碼:0.1101
  反碼:0.1101 //正數時,反碼=原碼
  補碼:0.1101 //正數時,補碼=原碼
  
  -0.1101
  原碼:1.1101
  反碼:1.0010 //負數時,反碼爲原碼取反
  補碼:1.0011 //負數時,補碼爲原碼取反+1
  
4.幾個特殊定義:
  n位補碼能表示的範圍:有符號數是 -2^(n-1)到2^(n-1)-1  無符號數是 0-2^n-1
  -128的補碼是10000000, -128+1=-127 ,(-127)補=10000001=10000000+00000001 符合運算規則
  0的補碼00000000

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章