聲明:以下二進制數據都是指八比特位長度的二進制數;以下十進制數都是指的整數。
1、什么是原碼?
我們來看一下百度百科的定義:
原碼(true form)是一種計算機中對數字的二進制定點表示方法;
原碼表示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1,其余位表示數值的大小。
舉個例子:
100的源碼怎么表示?--答案是:0 110 0100
-100的源碼怎么表示?--答案是:1 110 0100
此外,還要注意一點:
百度百科中看到一句話:原碼不能直接參加運算,可能會出錯。
他舉出一個例子:在數學中 1+(-1)=0;但是用二進制進行計算的時候就會變成:0000 0001+1000 0001=1000 0010,換算成十進制是 -2。顯然結果是錯誤的。
2、什么是反碼?
反碼通常是用來由原碼求補碼、或者由補碼求原碼的過渡碼。
那么同一個數的反碼與原碼的對應關系是什么呢?反碼跟原碼是正數時,一樣;負數時,反碼就是原碼符號位除外,其他位按位取反。
舉個例子:
100的原碼是?0 110 0100
100的反碼是?0 110 0100
========
-100的原碼是?1 110 0100
-100的反碼是?1 001 1011
從上面的例子來看
I、想知道一個十進制數的二進制反碼表示形式,得先知道這個十進制數的原碼。也就是說,原碼雖然簡單,但卻非常重要。
II、原碼、反碼都是數值在計算機中的表示方法,他們倆首位都表示符號位,即1為負、0為正;其余的為數值位。原碼的數值位的值就是所表示數的真值。反碼的數值位的意義我們不去深究。
3、什么是補碼?
在了解什么是原碼的時候,我們就發現了原碼在二進制加減運算中存在問題。
所以,計算機系統,數值一律采用補碼來表示和存儲。
原因是,補碼能夠將符號位和數值位統一處理;同時,減法和加法也可以統一處理。
在百度百科中,關於補碼的概念引入,他給出了一個非常有趣的例子:https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81/6854613?fr=aladdin;
這個例子解釋了以n值為模的系統里,減法問題如何轉化成加法問題的--把減數用相應的補數表示就可以了。
而這個例子中出現的補數的概念,用在計算機對於數值的處理上,就是 補碼。
那么補碼和原碼的對應關系是怎么樣的呢?
I、對於正數,他的原碼、反碼、補碼都是一樣的,即都是原碼的表示形式。
比如:100的原碼 0 110 0100;反碼 0 110 0100;補碼 0 110 0100。
II、對於負數的補碼,將其原碼除符號位外的所有位取反(0變1,1變0,符號位為1不變--這不就是求反碼的過程么。),然后加1。
比如:-100的原碼 1 110 0100;除符號位外按位取反 1 001 1011;再加1:1 001 1100(即為-100在計算機中的存儲形式--也就是-100的補碼)。
III、對於-100求補碼的方法,還有一種:
就是記住這個口訣:對負數求補碼,先寫出其絕對值的原碼,再按位取反,再加1。
我們來試一下:-100求補碼,先找出-100的絕對值100的原碼:0 110 0100;再按位取反 1 001 1011;再加1: 1 001 1100。
其實這兩種,在第二步取反的時候,就得到了一致的結果了,所以在第三步再加1,得到的結果一樣。所以上面兩種方法就看個人習慣了。。。
IV、對於0的補碼是唯一的:0000 0000。
(+)0我們就不必說了,符號位為0的正數,原碼、反碼、補碼都一樣:0000 0000。
(-)0求補碼→按位取反→1 111 1111→再加1→1 0000 0000(這里我們講解的是8位二進制數,所以最高位1舍去)→ 0000 0000 (補碼)。
最后總結:原碼、反碼、補碼(以下都是指整數的八位二進制形式)
對於正數 其原碼、反碼、補碼都一樣。以后遇到正數求補碼、反碼不要慌,寫出原碼就是答案。
對於負數 其反碼=原碼(除符號位)按位取反;其補碼=負數的原碼先取反碼再加1。
4、計算機中存儲的8位二進制數能夠表示的取值范圍為什么是 -128~127
首先我們要在腦海中有一個概念:我們這里所說的二進制數是指在計算機中存儲的數,而在計算機中存儲的數是原始數據的補碼形式。
有了這個概念為前提,我們就好理解了:
接下來參考一下知乎里面的一個回答,更能夠幫助我們理解這個范圍問題:
https://www.zhihu.com/question/20458542
以上是對計算機系統中對於數的二進制表示形式的總結,記錄下來,以便以后查看。