我是計(jì)算機(jī)專業(yè)大一新生(L)神(J)。剛開始摸二進(jìn)制。
很多朋友都知道計(jì)算機(jī)內(nèi)部的數(shù)據(jù)通過二進(jìn)制來儲(chǔ)存和計(jì)算,但是一個(gè)小小二進(jìn)制非要整一些花里胡哨(bushi)的東西,原碼補(bǔ)碼反碼的一群東西,頭大[石化]搞得我一臉懵。來自渣渣的咆哮
可是又不能真的不學(xué)[泣不成聲]日子再苦也得過是不是。在網(wǎng)上查了好多資料終于有了一點(diǎn)點(diǎn)頭緒。
為什么要引入補(bǔ)碼這個(gè)概念?
我們已經(jīng)知道在計(jì)算機(jī)的內(nèi)部,所有的數(shù)據(jù)都是以二進(jìn)制的形式存在的。但是,有一個(gè)問題,正數(shù)好說直接表示就好了,可是負(fù)數(shù)呢?計(jì)算機(jī)又存不了負(fù)號,那可咋辦呢?于是人們就想出了一種表示數(shù)的模式------一種能表示出符號的二進(jìn)制表示法,用最高位來表示符號,0就是正,1就是負(fù)。
以8位二進(jìn)制數(shù)為例,51和-51的二進(jìn)制如下(位數(shù)不足前面補(bǔ)0)
51=(00110011)?
-51=(10110011)?
瞬間就明朗了起來,但是仔細(xì)想一想還是有問題的。就是這個(gè)
(00000000)?=+0
(10000000)?=-0
正0和負(fù)0,啊這……有點(diǎn)奇怪。雖然正0和負(fù)0都是0,但是0對應(yīng)著兩個(gè)二進(jìn)制碼,這就使得二進(jìn)制表示的數(shù)少了一個(gè)。仍以8位二進(jìn)制為例,按照排列組合計(jì)算有256種不同的排列,可如果按照這種模式,那么它能表示255個(gè)數(shù)。所以這明顯不是最優(yōu)的表示模式,而且在計(jì)算的過程中可能會(huì)有別的問題(具體我也不是很了解會(huì)有啥問題,畢竟我也是小新手[尬笑])。
于是就引入了補(bǔ)碼這個(gè)東西,而剛剛的那種帶符號的表示方式被稱為原碼。
所以補(bǔ)碼到底又是個(gè)啥?
其實(shí)按照我的理解,補(bǔ)碼和原碼在根本上沒有多大的關(guān)聯(lián)。因?yàn)?,補(bǔ)碼直接就去解決最開始的那個(gè)問題:計(jì)算機(jī)無法直接儲(chǔ)存負(fù)號,那怎么表示負(fù)數(shù)?補(bǔ)碼就另辟蹊徑,找到了另一個(gè)解決問題的思路:將負(fù)數(shù)轉(zhuǎn)變?yōu)檎龜?shù)。
但是不是隨便轉(zhuǎn)化,有一個(gè)固定的方式,就是把十進(jìn)制的負(fù)數(shù)加上2的n次方,n是將要轉(zhuǎn)化為二進(jìn)制的位數(shù)。比如求-28八位補(bǔ)碼就用加上2的8次方,然后把和再轉(zhuǎn)化為二進(jìn)制。如此就避免了負(fù)數(shù)轉(zhuǎn)化為二進(jìn)制的問題。而正數(shù)本身就可以正常轉(zhuǎn)化為二進(jìn)制,所以正數(shù)的補(bǔ)碼還是它本身的二進(jìn)制。
那咋就又涉及到了反碼了呢?
這個(gè)問題問得好(據(jù)說自問自答的都是傻子[摳鼻]),通過加上2的n次方的方式終究太麻煩,而且不能與原碼建立聯(lián)系。而反碼就是二者之間的橋梁,不僅能聯(lián)通原碼與補(bǔ)碼,還能使原碼轉(zhuǎn)化為補(bǔ)碼更加簡單。在不引進(jìn)反碼的時(shí)候,從原碼到補(bǔ)碼的轉(zhuǎn)換是通過計(jì)算的方式,而通過反碼只需要在形式上的進(jìn)行變化。
通過反碼將原碼轉(zhuǎn)化為補(bǔ)碼非常簡單。符號表示法的負(fù)數(shù)二進(jìn)制的反碼,就是把除了最高位(符號位)的其余數(shù)位變成相反的數(shù),原來的1變?yōu)?,0變?yōu)?。比如
(10010011)?的反碼是(11101100)?
因?yàn)橐M(jìn)反碼、補(bǔ)碼都是為了解決負(fù)數(shù)的表示問題,所以正數(shù)的反碼和補(bǔ)碼都是它本身。
得到反碼之后把反碼加上1就得到了補(bǔ)碼。那有的朋友可能會(huì)有些疑惑,這是為什么呢?
為什么通過上述操作能得到補(bǔ)碼?
這個(gè)問題也困擾了我很久,我試圖通過數(shù)學(xué)的方式去證明它,可以證明,但是很麻煩。我前面說通過反碼的渠道將原碼轉(zhuǎn)化為補(bǔ)碼是一種形式上變化的方法,沒錯(cuò)不必想太復(fù)雜,我們先回到補(bǔ)碼的本質(zhì)。
補(bǔ)碼是十進(jìn)制負(fù)數(shù)加上2的n次方在轉(zhuǎn)化為二進(jìn)制得到的,就有這么個(gè)式子
補(bǔ)碼-2的n次方=原碼
于是就有
原碼+補(bǔ)碼=2的n次方
這就是我們剛才操作的依據(jù)。這個(gè)2的n次方有個(gè)專業(yè)點(diǎn)的名字叫做模,寫成數(shù)字的形式就是1后面n個(gè)0。
而反碼與原碼的數(shù)位剛好互補(bǔ),相加就能得到一串的1(假設(shè)有n個(gè)1),那反碼加一在加上原碼就呢個(gè)得到1后面n個(gè)零,就是模。又因?yàn)椤霸a+補(bǔ)碼=2的n次方”,所以反碼加一就是補(bǔ)碼。
舉個(gè)例子(上面的例子)
(10010011)?的反碼是(11101100)?
相加得(11111111)?(最高位是符號位,不做加法)
反碼加一得(11111000)?
與(10010011)?的和為(100000000)?即2的n次方
以上大概就是原碼補(bǔ)碼與反碼的前世今生了,本人水平有限,文章中可能會(huì)有一些錯(cuò)誤,歡迎大家在評論區(qū)指正。也歡迎大家在評論區(qū)討論。
1.《【10的負(fù)一次方等于多少】專題計(jì)算機(jī)中的二進(jìn)制原來是這樣:原碼、反碼和補(bǔ)碼》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《【10的負(fù)一次方等于多少】專題計(jì)算機(jī)中的二進(jìn)制原來是這樣:原碼、反碼和補(bǔ)碼》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實(shí),對其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請保留本站內(nèi)容來源地址,http://f99ss.com/shehui/2062115.html