天天看點

原碼、補碼、反碼與移碼

原碼、補碼、反碼與移碼

在現實生活中我們常常用“+”,“-”号來表示一個數的正負(真值),但是在計算機中無法用正負号表示,是以用二進制的最高位為1表示負,0表示正。而小數則用 ‘.’ 隔開符号位與數值,整數用‘,’号隔開。假設用5位表示,則+6為0,0110 -6則為1,0110 。+0.0001則表示為0.0001,-0.0001則表示為1.0001。

一、原碼:

1.整數表示:

用最高位表示正負的二進制代碼稱為原碼,如上所述。

而負數如-6 : 1,0110。相當于0110加上10000(10000-(-0110)) 即24。

是以原碼的表達式可以寫成:

原碼、補碼、反碼與移碼

注:這裡2n和-2n取不到,因為最高位為符号位,那麼最大也隻能為0,1111即24-1,最小為1,1111即-(24-1) = -24+1。而0有兩種表示,即0,0000或1,0000(24+0)

是以原碼整數0有兩種表示方法

2.小數:

小數-0.0001可以表示為1.0001,相當于0.0001加上1。

是以小數原碼表達式為:

原碼、補碼、反碼與移碼

小數0也有兩種表示即0.0000和1.0000。

二、補碼

以時鐘為例,當從6點到4點可以用6-2 = 4或6+10 = 16,再對16模12餘4。是以減一個數相當于加上這個數的補數。例:10-2 = 8 也可寫成10 + 8 = 18 再模10餘8。而上面的12(鐘)和10都是當兩個數相加滿了的時候進一位所代表的值。而相應的補數是用12或10減去之前的2來得到的。

1.整數:

如-1011,首先對其取補數用10000+(-1011)= 00101。但是怎麼來區分0,0101是-1011的補數還是隻是+1011?是以我們用最高位為1表示為負數的補數(相當于加上24)。是以-1011的補數為1,0101。

是以0,1010(10)-0,1011(11) = 0,1010+1,0101 = 1,1111(-1)。

注: 這裡1,0101最高位即符号位也參與了運算。

是以整數補碼表達式如下:

原碼、補碼、反碼與移碼

這裡為2n+1是因為第一次求補數加了2n,然後用最高位為1表示是負數的補數又加了2n。-2n能取到因為2n+1-2n=2n,是以-24為1,0000。這裡的0隻有一種表示形式因為10,0000 + 0 = 10,0000而因為隻能用5位表示是以最高位的1被舍掉,是以0表示為0,0000與+0一樣。

是以補碼的0隻有一種表示。

2.小數:

原碼、補碼、反碼與移碼

三、反碼

1.整數:

如上面10000+(-1011)= 00101所述,10000可以寫成0,1111+1

是以上面可以寫成0,1111-1011+1即0,0101+1。因為二進制中隻有0、1,是以1減去一個數,相當于對這個數取反。

是以補碼又可以用一種更快的方式表示,即除符号位外,其他位取反,然後得到的值再加上1。如-1011即1,1011的補碼可以表示為1,0100+1=1,0101。

而取反得到的1,1011為反碼。

正數的反碼與原碼、補碼一樣,是以反碼整數的表達式為:

原碼、補碼、反碼與移碼

0有兩種表示0,0000和0,1111。

是以反碼的0有兩種表示方法。

2.小數:

原碼、補碼、反碼與移碼

四、移碼

有時候當看補碼無法看出大小,如1,0101(-1011)和0,1111可能會誤以為1,0101更大,是以為了更好的區分,把兩位數都加10000得到0,0101和1,1111注意這裡的1在移碼中隻是一個數,不是符号位。

是以移碼的表達式為2n+x,x為真值。

計算機中數大多都用補碼表示,因為:

1.補碼中0隻有一種表示形式。

2.補碼符号位也參與了計算。

3.由于0隻用一種表示法,則可以多表示一位負數。

4.用補碼後,減法變成了加法,計算機隻用做加法,不用專門設定減法器了。

繼續閱讀