1. 程式人生 > >計算機組成原理:十進位制、原碼、反碼、補碼的轉換關係

計算機組成原理:十進位制、原碼、反碼、補碼的轉換關係

原碼、反碼、補碼的第一位都是是符號位,0為正數,1為負數,不論小數整數都是如此。

eg:0.2(2)是個負數,1.2(2)是個正數,11112(2)是個負數,01112(2)是個正數。

十進位制->二進位制原碼

二進位制原碼就是單純求模運算得到的。

這個轉換規則小數和整數區別較大,正數向負數轉化很簡單。

正整數除2取餘,直到商為零,餘數倒敘排列

eg:8(10)=0100(2)  當然,如果是一個8位機的話,一個數字由8個二進位制位組成,所以應該是8(10)=0000  0100(2)

注意:對於一個8位機來講,原碼能表示的整數範圍是-128~+127,和256沒關係。

正小數:整數部分按上面說的辦,這裡只說小數部分該如何處理。

乘2取整法,即將小數部分乘以2,然後取整數部分,剩下的小數部分繼續乘以2,然後取整數部分,剩下的小數部分又乘以2,一直取到小數部分為零為止。如果永遠不能為零,就同十進位制數的四捨五入一樣,按照要求保留多少位小數時,就根據後面一位是0還是1,取捨,如果是零,舍掉,如果是1,向入一位。換句話說就是0舍1入。讀數要從前面的整數讀到後面的整數。

eg:將0.125(10)換算為二進位制

0.125*2=0.250    小數點前為0,答案第一位為0

0.250*2=0.5    小數點前為0,答案第二位為0

0.5*2=1    小數點前為1,答案第三位為1

所以0.125(10)=0.001(2)

負數:先求出其絕對值的二進位制原碼,然後將第一位(也就是符號位上的0)強行改為1就可以了。

eg:-0.5(10)=1.1(2)      -1.5(10)=11.1(2)

        -8(10)=1100(2)  同樣,如果是一個8位機的話,應該是-8(10)=1000  0100(2)

二進位制原碼->二進位制反碼

這個轉換小數和整數一樣,但是正數和負數不一樣。

對於正數,反碼就是其原碼本身。對於負數,反碼是其原碼符號位不變(還是1),其餘各位直接取反。

eg:

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

二進位制原碼->二進位制補碼

正數的補碼和原始碼相同,負數的補碼=反碼+1。整數小數用同一套規則。

[-y]=-[y]+2^-n   即:對[y]

包括符號位求反最末位加1