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