原碼,反碼,補碼及減法介紹如下:
眾所周知,計算機內(nèi)部是以二進制存儲數(shù)據(jù)的,對于不同的數(shù)據(jù)類型可能存儲的格式含義不一樣。例如有符號整數(shù),最高位是符號位,其余代表數(shù)值;那么它在計算機里要怎么運算表達呢,下面來一步步說一下:
舉個例子,1+1怎么表達呢?
1的二進制表達為(為了方便用1個字節(jié)表示):00000001
那么1+1即表達為:00000001 + 00000001 = 00000010 = 2
是吧,這樣子是對的,so easy。
2.?再接著看下面,2-1怎么表達呢?
2的二進制為:00000010
-1的二進制為:10000001
那么:2-1=2+(-1)=00000010+10000001=10000011=-3
3.?什么是原碼
維基百科的定義:原碼(True form)是電腦運算的名詞,是指“未經(jīng)更改”的碼。例如上面舉的例子,2的二進制表達為00000010,00000010即是原碼。
4.什么是補碼
維基百科的定義:補碼(英語:2's complement)是一種用二進制表示有號數(shù)的方法。
補碼是根據(jù)原碼規(guī)則計算而來的:
正數(shù)和0的補碼:該數(shù)字本身。
負數(shù)的補碼:將其除最高位(即符號位)取反再加1得出的。
那么什么是取反,0變成1,1變成0就是取碼了。
舉個例子,-1,原碼是:10000001
第一步,除最高位取反,得到:11111110
第二步,加1:11111111
最后-1的補碼即為:11111111
對了,在轉(zhuǎn)換補碼的過程中,還有步驟:取反。取反得出來的數(shù),稱為反碼。
5.什么是反碼
反碼是一種在計算機中數(shù)的機器碼表示。對于單個數(shù)值(二進制的0和1)而言,對其進行取反操作就是將0變?yōu)?,1變?yōu)?
反碼跟原碼是正數(shù)時,一樣;負數(shù)時,反碼就是原碼符號位除外,其他位按位取反。
反碼是在原碼和補碼轉(zhuǎn)換過程中過渡的一種運算而已。知道了原碼和補碼
的轉(zhuǎn)換,其實也就知道什么是反碼了,只是把它抽象出來了。
6.減法到底是怎么做呢?
說完了原碼,反碼和補碼,回到最開始的問題,到底怎么運算才對啊?個位數(shù)都算錯可丟人了。
計算機內(nèi)部采用補碼來計算的。
i. 首先我們要把需要計算的轉(zhuǎn)換成補碼
2的原碼是:00000010,由于是正數(shù),補碼即為本身:00000010。
-1的原碼是:10000001,由于是負數(shù),補碼為:11111111
ii. 計算機內(nèi)部是采用補碼加法,統(tǒng)一了運算規(guī)則。例如把2-1看成是:2+(-1)。于是2-1實際為:
00000010 + 11111111 = 00000001 = 1
iii. 最終計算結(jié)果是正常的,對得起學過的小學數(shù)學了。
7.?究極原因:為什么非要補碼?
在我閱讀和思考的時候,很多思想是通過時鐘循環(huán)來表達其本質(zhì)。
我個人理解為公式的變換,相對容易理解。怎么說呢?我們推導一下下面的公式。
10-8=10+(-8)=10+(-1-8)+1=10+[(-1-8)+1]
來到這里,我們停一下。這個公式推導過來是等價的,看看方括號里面是不是和計算機內(nèi)部計算取反+1很相似?
-1是二進制是:11111111,-8的原碼是:10001000,反碼是:11110111,(-1-8)除開高位的運算為:1111111-0001000=1110111,結(jié)合高位即為:11110111,即就是取反的結(jié)果,亦即(-1-8)的結(jié)果。
方括號里的實質(zhì)即是[(取反)+1]=[補碼],這就是為什么可以使用補碼計算了。