|
以下內(nèi)容轉(zhuǎn)自百度知道,回答者:金的同位素。
說到二進(jìn)制補(bǔ)碼,大家都知道:有符號(hào)數(shù)的負(fù)數(shù)的補(bǔ)碼是 其正數(shù)的反碼+1,例如 10001111 的補(bǔ)碼是反碼01110000 加 1 =01110001 ,很多書都這么說,可是為什么這樣計(jì)算的結(jié)果就是它的補(bǔ)碼?為什么要用補(bǔ)碼?很多書要么不解釋,要么就是說:這是因?yàn)樵谟?jì)算機(jī)內(nèi)補(bǔ)碼計(jì)算最快。(其實(shí)是補(bǔ)碼計(jì)算指令的CPU設(shè)計(jì)更容易實(shí)現(xiàn)) 最初我看的書,《大學(xué)計(jì)算機(jī)基礎(chǔ)教程》(我非計(jì)算機(jī)專業(yè)),這破書說不清,道不明,給與我非常嚴(yán)重負(fù)面的影響,以至于我在以后的計(jì)算機(jī)學(xué)習(xí)過程中,程序設(shè)計(jì)中遇到大大小小不少麻煩和迷茫。
在某些計(jì)算機(jī)組成原理書上提到:其實(shí)補(bǔ)碼的計(jì)算原理,是用一個(gè)模來減去無符號(hào)的正數(shù)部分。譬如時(shí)鐘,12點(diǎn)之后是13點(diǎn),但是時(shí)鐘上沒有13點(diǎn)怎么辦?就用13減去12=1點(diǎn)。這個(gè)模是12.可惜這個(gè)比喻并不是很好。
請(qǐng)看 一個(gè)字節(jié)長(zhǎng)的無符號(hào)數(shù)的表示范圍 :0~255,有符號(hào)數(shù)的表示范圍:-128~127 , 注意,這個(gè)表示范圍的寫法極有可能影響我們的思維,從而導(dǎo)致錯(cuò)誤。我們應(yīng)該這樣來寫:0~127 ~ -128 ~ -1 ,這才是較好的寫法。為什么?因?yàn)檫@個(gè)寫法的數(shù)的順序與0~255 一一對(duì)應(yīng)。
由上,我們了解,其實(shí)補(bǔ)碼不過是用128 ~ 255 這段范圍的數(shù)來表示 ~128 ~ -1這段范圍的負(fù)數(shù)。那么我們就可以憑自己,而不是看教材,就可以推測(cè)出計(jì)算補(bǔ)碼的公式,就是:256-欲求的負(fù)數(shù)的絕對(duì)值= 此負(fù)數(shù)的補(bǔ)碼。
沒錯(cuò),就是這么簡(jiǎn)單的東西,可是卻困擾了很多人�?梢娪袀€(gè)好的教材是多么的重要。
至于前面 “負(fù)數(shù)的補(bǔ)碼是 其正數(shù)的反碼+1” , 極為垃圾的教材才會(huì)把這個(gè)計(jì)算方法作為初始方法來教。因?yàn)檫@個(gè)計(jì)算方法屏蔽了補(bǔ)碼的計(jì)算原理。其實(shí)這不過是 “256 - 欲求的負(fù)數(shù)的絕對(duì)值 = 此負(fù)數(shù)的補(bǔ)碼”的一個(gè)比較取巧的計(jì)算方法而已。請(qǐng)看 256=1 0000 0000 =1111 1111+1,而 1111 1111減任何二進(jìn)制數(shù)的結(jié)果就是把這個(gè)數(shù)取反,那么 256 - 某二進(jìn)制數(shù)A 既是:將 A取反 +1
以上:完畢!
注:所有討論均在字節(jié)長(zhǎng)范圍內(nèi)(8bit) 進(jìn)行
|
|