補碼原理——負數為什么要用補碼表示


參考:https://blog.csdn.net/leonliu06/article/details/78685197

 

原文寫的很牛B

 

文首

  我們都知道負數在計算機中是以補碼(忘了補碼定義的戳這里)表示的,那為什么呢?本文嘗試了解補碼的原理,而要想理解它,首先得理解算術中“模”的概念。所以首先看一下什么是模,然后通過一個小例子來理解補碼。

 

1 模(Modulo)

 

1.1 什么是模數

In mathematics, modular arithmetic is a system of arithmetic for integers, where numbers “wrap around” upon reaching a certain value—the modulus (plural moduli).

 

1.1.1 理解

  模是指一個計量系統的計數范圍。如時鍾等。計算機也是一個計算器,它也是有一個計量范圍,即都存在一個“模”。   如時鍾的計量范圍是0~11,模 = 12。   32位計算機的計量范圍是2^32,模 = 2^32。   “模”是計量器產生“溢出”的量,它的值在計量器上表示不出來,計量器上只能表示出模的余數,如12的余數有0,1,2,3,4,5,6,7,8,9,10,11。

 

1.2 補數

  假設當前時針指向11點,而准確時間是8點,調整時間可有以下兩種撥法:

一種是倒撥3小時,即:11-3=8 另一種是順撥9小時:11+9=12+8=8

  在以模為12的系統中,加9和減3效果是一樣的,因此凡是減3運算,都可以用加9來代替。對“模”12而言,9和3互為補數(二者相加等於模)。所以我們可以得出一個結論,即在有模的計量系統中,減一個數等於加上它的補數,從而實現將減法運算轉化為加法運算的目的。

 

1.3 再談“模”

  從上面的化減法為加法,以及所謂的溢出等等可以看到,“模”可以說就是一個太極,陰陽轉化,周而復始,無始無終,循環往復。

2 補碼原理

  計算機上的補碼就是算術里的補數。   設我們有一個 4 位的計算機,則其計量范圍即模是   2^4 = 16,所以其能夠表示的范圍是0~15,現在以計算 5 - 3為例,我們知道在計算機中,加法器實現最簡單,所以很多運算最終都要轉為加法運算,因此5-3就要轉化為加法:

 

 # 按以上理論,減一個數等於加上它的補數,所以  5 - 3  # 等價於  5 + (16 - 3)   // 算術運算單元將減法轉化為加法  # 用二進制表示則為:

 

0101 + (10000 - 0011)  # 等價於  

0101 + ((1 + 1111) - 0011)  # 等價於  

0101 + (1 + (1111 - 0011))  # 等價於  

0101 + (1 + 1100) // 括號內是3(0011)的反碼+1,正是補碼的定義  # 等價於  

0101 + 1101  # 所以從這里可以得到  

-3 = 1101  # 即 `-3` 在計算機中的二進制表示為 `1101`,正是“ -3 的正值 3(`0011`)的補碼(`1101`)”。  # 最后一步

0101 + 1101 等於  1001012345678910111213141516171819

 

  因為我們的計算機是 4 位的,第一位“溢出”了,所以我們只保存了 4 位,即 0010,而當計算機去讀取時這正是我們所期望的 2!!嘆為觀止吧,天才般的設計!感恩伏羲、萊布尼茲和馮諾依曼!

 

文末

  一陰一陽之謂道。萬事萬物,陰陽轉化,周而復始,無始無終,循環往復。 --------------------- 作者:leonliu06 來源:CSDN 原文:https://blog.csdn.net/leonliu06/article/details/78685197 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 


免責聲明!

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



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