跟大家講解下有關計算機中的負數為什么用補碼存儲,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說計算機中的負數為什么用補碼存儲,小編也收集到了有關計算機中的負數為什么用補碼存儲的相關資料,希望大家看到了會喜歡。
計算機中負數使用補碼存儲可以簡化計算機基本運算電路,使加減法都只需要用加法電路實現,用加法替代減法。補碼是負數的最小正同余數,所以加一個負數和減一個正數都可以用加一個補碼來表示。
本教程操作環境:windows7系統、Dell G3電腦。
相關推薦:《編程視頻課程》
1.引子你知道計算機中以什么形式存儲整數嗎?是符號位加值位嗎?值位是按照正常的二進制方式存儲嗎?
如果后兩個問題你都回答是,那就意味著當用3位二進制進行存儲、且符號位0表示正1表示負時,1會存儲成001,-1會存儲成101。可惜事實不是這樣,計算機中是用補碼的形式而不是剛剛那種看上去很自然的形式存儲整數,補碼雖然也是用符號位加值位來表示,但表示的規則不太一樣:1會存成001,-1會存成111。
如果三個問題你都回答對了,你知道計算機中整數以補碼的形式存儲,但你知道為什么要用這種形式嗎?以及「正數的補碼等于原碼;負數的補碼等于反碼加1,而反碼等于原碼符號位不變,其余各位取反」這樣的補碼到底意味著什么?(假設你不知道,請接著往下看吧 XD)
先看使用補碼的目的,然后忘掉上面那個補碼定義,跟我從這個目的開始,一步步探索補碼的本質。 目的:為了簡化計算機基本運算電路,使加減法都只需要通過加法電路實現,也就是讓減去一個正數或加上一個負數這樣的運算可以用加上一個正數來代替。于是改變負數存儲的形式,存儲成一種可以直接當成正數來相加的形式,這種形式就是補碼。(正數不用變,所以接下來的討論中一般略去正數)
2.補碼是怎么把減法變成加法的?2.1.用時鐘理解減法變加法
這是一個身邊的例子,當你校對時鐘的時候,假設發現鐘是6點,但實際上現在才2點,也就是它走快了4個小時,你可以有兩種方法進行校正,一種是逆時針撥回4個小時到2點,另一種是順時針撥6個小時到12點然后再撥2小時,也就是順時針撥8個小時到2點。所以對于時鐘的表盤來說,設-N表示逆時針撥N個小時,N表示順時針撥動N個小時,那么-4 = +8,同樣還會有 -1 = +11、-5 = +7,甚至也可以 -4 = +8 = +20 = +32 = -16...
這里邊隱藏了什么規律?其實在數學中,-4、+8、+20、+32、-16可以歸為符合某個條件的同一類數字 —— 對于模12同余。
中文維基上對于模和同余的定義是:兩個整數a、b,若它們除以正整數m所得的余數相等,則稱a、b對于模m同余。
而在一個可溢出計數系統中,把計數系統容量作為模,那么所有對此模同余的數在此計數系統中都會有同樣的表示,而且運算等價。 比如上面例子中的時鐘表盤就是一個可溢出計數系統,模為12,所以-4、+8、+20、+32、-16這些對模12同余的數在時鐘表盤上的表示是一樣的,而且對時針做這些操作的結果也是一樣的,都會撥到同樣的位置。
一個n位二進制構成的計數系統,因為會舍棄溢出的高位,所以也是一個可溢出的計數系統,它的模為\(2^n\) 。(從0數到\(2^n -1\),再多就溢出) 由此可以推理,在一個3位二進制構成的模為8的計數系統中,-2,-10,6,14可以用同樣的二進制數來表示,同時減10和加14會得到一樣的結果。
2.2.引出 補碼
所以,只要 補碼 是一個負數的正同余數,那么就能實現加這個正同余補碼跟加另一個負數是一樣結果的效果。對一個負數來說,有無數個正同余數滿足條件,為了減少不必要的運算,可以規定補碼就取其中最小的正數。
可能因為通過原碼求 補碼 是一個補模運算,所以它被稱為 補碼 。
注意,這里的 補碼 都被我用特殊標識,因為這還不是計算機里真正的存儲的補碼形式,它應該叫補數,不過相信我,已經很接近了
3.完善 補碼3.1.這種 補碼 表示還有點問題
通過轉換成 補碼 ,減一個數確實變成加一個數了,看似很不錯,但卻有一個明顯的問題,那就是數本身的符號丟失了。 比如3位二進制,正常表示0~7,使用補碼法它能代替-8~-1的運算,但它不能真正表示-8~-1,因為你不知道它到底是正數還是負數。 我們把負數轉換成了一種在運算中更讓計算機喜歡的形式,但它卻丟失了自己本身作為數的信息。
怎么解決這個問題,可能有人很快就拍腦袋:那就加一位來表示正負得了。但這樣的話運算時怎么辦,從第二位開始算么?那進位去位的時候是不是也需要特別注意一下不要影響到符號位?你會發現這個問題并不是那么簡單。
3.2.怎么完善 補碼
不知道大牛是怎么想到的,問題解決得非常完美:
在保持補碼特性的前提下 (也就是減一個數還是照樣變成加一個數)增加正負的表示 (能真正表示-8~-1了,只用看符號位是0還是1)還能讓運算時不用另外區分符號位,直接把符號位當成值位進行運算,而結果的正負號自然會符合這個正負表示法(也就是符號位的進位和值位的進位都會自然地合理)而且解決方式真的皮,簡單到出人意料,就是前面你拍腦袋想到的辦法:加一位來表示正負。具體做法是:在左側高位增加一個符號位,這個符號位連同前面我們推演出的 偽補碼 一同構成真正完善的補碼。實現的效果:通過讀取符號位能得知數的正負,同時符號位在加法運算中跟值位一樣參與運算、進位、退位。
4.最后總結一下
使用補碼的目的:簡化計算機基本運算電路,使加減法都只需要用加法電路實現,用加法替代減法。補碼為什么能達到這個目的:n位二進制可以構成一個可溢出計數系統,在這樣的系統中,把計數系統容量作為模,所有對此模同余的數在此計數系統中都會有同樣的表示,而且運算等價。而補碼就是負數的最小正同余數,所以加一個負數和減一個正數都可以用加一個補碼來表示。怎么計算補碼:正數的補碼是它本身;對負數求最小正同余數(模為值位的容量)放入值位,符號位置為1,得到負數的補碼。想要查閱更多相關文章,請訪問PHP中文網!!
以上就是計算機中的負數為什么用補碼存儲?的詳細內容,更多請關注php中文網其它相關文章!
來源:php中文網