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