C語言複習:原反補碼

這篇博客是對於我個人的知識的複習,當然如果有某位大佬能夠指出這裏面有哪些概念含糊不清或者難懂,麻煩指出來感激不盡。

原反補碼

放出鏈接原返補碼深入探究
在大學的C語言課堂上,可能就接觸到了原反補碼的概念,大學老師說,正數的原反補碼就它本身,負數的反碼就是符號位不變,其他數值取反,補碼則是反碼+1.
但是爲什麼,我從大一開始就有這個疑惑,爲什麼正數就不用變,負數則要這麼複雜?
直到我拜讀了刀斧手何在大大的博客才解開了我的迷惑豁然開朗。

原碼

正碼反碼補碼的存在是爲了解決二進制數字中存在符號位情況下的減法運算。
正數和正數的加法,負數和負數的加法使用原碼問題不大,只要把符號位變正確就足夠了,但是正數和負數相加會產生錯誤,因此有了反碼的產生。

反碼的產生

用反碼來進行加減運算會發現,正數相加和正負數相加結果正確,而負數相加則會產生錯誤,不過問題不大,因爲兩個負數相加可以認爲讓兩個數的絕對值相加,然後改變符號位。
上面的方法有一個小瑕疵,11110+00001 = 11111(-0),兩個相反數相加的結果是-0,顯得很怪異,因此有了補碼

補碼

補碼的思想和模有關係,假設現在鐘錶的指針指向10,假如我們想讓它指到8,有兩個操作。

  1. 把時針往前撥兩個單位
  2. 讓時針往後走10個單位。
    因此這裏有了
    (10-2)%12 = (10+10)%12=(12+8)%12=8
    上面就是補碼的思想,減去一個數在有數據溢出的情況下,相當於加上取模的數減去這個數後的數。
    這裏好像有點繞口,我們實際計算一下。
    假如進行2減1的操作
    000010-0000001 = 000010 + (111111)=000001
    還有一個問題要解決,爲什麼負數的補碼等於反碼加1.
    原因是因爲負數的原碼加上負數的反碼,符號位不加,所有位都成爲全1,加上1就是最高位爲1,其他位爲0的數,所有相加後大於1的數都會產生溢出,溢出的數位可能會存放在某個寄存器中。
    同時解決了正負0的問題,10000000實際爲-127.

綜上所述,反碼相加利用了減一個數等於加一個數的相反數的思想,但是因爲有正負0的情況存在,所以我們引入了補碼。
補碼的思想是因爲二進制能表示的數是有限的,兩個數相加可能會有溢出值產生,所以減一個數相當於加上模減這個數。

OK,原碼,反碼,補碼之旅就到這裏結束。補碼第一次看總會覺得很繞,想言簡意賅,就怕哪裏遺漏了。講得細緻,又不免連自己都覺得囉裏囉嗦。謝觀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章