計算機實現減法學習心得


  前面我們知道了人們利用電子電路知識實現了加法,那么要實現減法是不是也要重新設計一套電路器件呢?答案是不用的,因為在計算機二進制里實現減法實際上是通過加法來實現的,例如計算a-b就是計算a+(b的補數),這樣利用加法就實現了減法,有點類似十進制的a-b=a+(-b),即相當於減一個數就等於加他的相反數,其實二進制減法也是加上相反數,只不過這里用二進制的補數來表示一個負數。

  十進制里表示一個負數,我們只需要簡單的在這個數前面加一個負號即可,但是二進制里你怎么加個負號啊,又怎么表示一個負數呢?所以這里要轉換一下,我們知道一個數加一個他的相反數會等於零,例如 1+(-1)=0, 1的二進制是0000001,也就一個數加 00000001 后等於 0,那這個數就是1的二進制相反數,這里叫補數。

--------------------------------------------------------------------------------------------------------------------------------

      00000001

   +   ????????          =   求出這個?數是11111111   , 這個數也就是0000001的相反數,即補數。

   =  00000000

--------------------------------------------------------------------------------------------------------------------------------

那么我們怎么能求出一個二進制數的補數呢?

  只要把要轉換的數每一位取反,即0就換成1,1就換成0,這個在電路里也很容易實現,通電的就斷開,斷開的就通電,  00000001 取反  ->  11111110  , 取反后再加1 -> 11111111 ,這樣就求出一個數的補數了,是不是很簡單。根據這個規則求得的補數和原來的數相加都會變成0,這個和10進制里的相反數一樣。

  知道了補數,和補數在加法里面的作用,來看看負整數的二進制表示,我們規定最高位為符號位,在這個符號位放1就表示是負整數,符號位放0就表示是正整數

比如前面的 11111111 最高位是1,那么這個數就是負數,只不過刨去符號位,剩下的數不能直接轉成正數,而是要取反加1,比如 剛剛的 1111111 去掉符號位,還剩7個1,111111 = 127 這樣算剛剛的數就變成 -127了,這么算是錯的,我們要按取反的方法來推出負數,在通過符號位判斷出這個數是負數后,取反加1即可。

  現在又有新問題了,如果 1111111 既可以表示十進制的 256 又可以表示成十進制的 -1 ,那么計算機怎么知道這個是正數還是負數呢,直接把111111丟給計算機,計算機當然不知道這是正數還是負數,所以丟給計算機這串數值時,我們要提前定義一下變量類型,也就是要告訴下計算機這是什么類型的數,這也就是為什么我們在C語言里定義變量要給定變量類型的原因,試想,你不告訴計算機變量類型,他都不知道這是數字還是經過ASCII碼表轉換后的字符串,當然正數還是負數也分不清了。C語言里有 unsigned short類型,如果給定這個類型,計算機就知道你給定的數是按正數來處理,諸如剛剛的 11111111補成16位的 unsigned short類型就變成了 0000000 1111111,這就是 256。如果把這個數定義成short類型,計算機就會把最高位當作符號位 ,剛剛的 111111會補成16位的 1111111 1111111,這個類型的變量如果最高位是1 ,就是負數了。

  因為16位unsigned short的變量類型,不用空出一位來表示符號位,所以unsigned short的取值范圍就是 0 ~ 65535,(2的16次方-1)

      32位的 short的變量類型需要空出一位當符號位,所以只剩15位來存數據,那2的15次方=32768 ,因為負數不用把0考慮進去,所以負數范圍是 -32768 ,正數是 32767。在學習計算機前,對計算機的印象總是計算機計算很快很快,計算機能算出很大很大的數,這樣看看,如果程序員寫程序時沒有給定合理的變量的話,計算機的計算能力也很有限啊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM