为啥八位的计算机可以用补码表示-128
1.解決問題第一步
要想講清楚-128這個問題,就像練北冥神功要先散功一樣,先把你心中對原碼,反碼,補碼的一套認識全部忘掉
2.補碼的本質
首先灌輸一個新的概念叫,模。什么是“模”?
想象日常使用的鐘表,它可以顯示0~12點的時間,假設現在是2點鐘,請用手動撥動時針的方式將時間減4小時,你會怎么做?
有兩種方式:
1.逆時針將時針撥4小時
2.順時針將時針撥8(12-4)小時
這里要講的是第二種方式,為什么順時針撥12-4也可以達到和正常思維的第一種方式一樣的位置。12就是模。
同樣的,如果是十進制的兩位數,80-10 和 80+90在不考慮百位數的基礎上都是70。這里的90就是100-10得來的,這種情況下100就是模
模就好比是一個極限,在它的范圍內,兩個相加等于模的數互為補數,還是舉100的例子
90和10, 55和45,68和32,互為補數
在模的范圍內做減法,可以將X-Y的減法變更為X+Y的補數的加法,當然前提是不考慮百位數
思考題,上面舉的例子是大數減小數,那么如果是小數減大數會怎么樣呢?
如果是10-80,結果應該是-70,但如果按照10+(100-80),結果是30。
而很明顯-70和30不是一回事,這里也沒有百位數的問題,這種情況應該怎么破?
當初的那些先賢們想出來的辦法很簡單,就是把這兩個數直接劃上等號,正好順便解決了負數的表達方式。再來仔細看看這兩個數的關系:-70絕對值的補數就正好是30
所以在計算機中,負數的表達方式就是它絕對值的補數
但是問題又來了,看起來這個解決方式很完美了,但別忘了,30他已經代表了正數的30了,現在又要用來代表負數的-70,誰知道它出現的時候到底是代表哪個數?
為了解決這個問題,需要給這套規則劃定一個范圍,原來是0~99的正數,現在既然要用部分正數來代替負數了,那就要規定一個范圍來使得一個數只代表一個含義,正好一人一半,0~49這個區間就代表正數,50~99的區間就用來代表各自補數的負值,例:98就代表-2
3.-128的真正含義
現在回到二進制的計算機世界,8位二進制數一共可以表示2的8次方,256個數,即0~255 (別忘了0也要占一位的),他們的極限就是256,即256是8位二進制數的模 ,應該不難理解吧,同上十進制的兩位數0~99的模是100。
還是用二進制來說明清楚,8位二進制能表示的數的極限是
1 1 1 1 1 1 1 1, 就是255,在這基礎上加0 0 0 0 0 0 0 1,出現了進一位 即 1 0 0 0 0 0 0 0 0
這個1 0 0 0 0 0 0 0 0就是8位二進制數的模,256
同樣按照第二步講的邏輯,一半的數0~127,代表其正數本身,另一半的數 128~255,代表其補數的負值,即“-1~-128”的區間。而 “X-Y”的減法 就用 “X+Y的補數” 的加法來表示,完美! 唯一需要注意的事情是任何計算的輸入值和輸出結果值都需要嚴格遵守-128~127的范圍,一旦溢出就會報錯。
對于減法來說,按照上述講解【-1模256=255】,也就是說,我們計算機需要做-1操作,直接加上-1的補碼,也就是255的原碼
那么根據上述的論述我是不是可以得出下面的公式:
一個負數的補碼=模 - 該負數的絕對值對應的二進制(請自覺摒棄符號位這一概念,就是二進制)
對于這個公式我給你舉個例子:
比如我們有-1這個操作,那么-1我們求解-1的補碼就是
1 0000 0000
- ?0000 0001
————————
???1111 1111
那么-128的補碼就是:
1 0000 0000
- ?1000 0000
————————
???1000 0000
這里請你擯棄128原碼是0,1000 0000,即摒棄符號位這個概念,128原碼就是1000 0000
轉載知乎
總結
以上是生活随笔為你收集整理的为啥八位的计算机可以用补码表示-128的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从补码的来源剖析到为啥补码=原码按位取反
- 下一篇: 关于定点机中的比例因子