計算機組成原理:十進位制、原碼、反碼、補碼的轉換關係
原碼、反碼、補碼的第一位都是是符號位,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]