原码、反码、补码的产生、应用以及优缺点有哪些?
google了一下,看到了這樣一篇文章,注意到文中關(guān)于補(bǔ)碼來(lái)歷的描述,可以總結(jié)如下:
補(bǔ)充解釋一下“模”的概念(不準(zhǔn)確):
考慮時(shí)鐘上時(shí)間的計(jì)算,假設(shè)現(xiàn)在時(shí)針指向數(shù)字3,若問(wèn)“6小時(shí)前時(shí)針指向的數(shù)字是幾”,則可以:
1. 將時(shí)針逆時(shí)針撥動(dòng)6格。
2. 將時(shí)針順時(shí)針撥動(dòng)12 - 6 = 6格。
兩者的結(jié)果是一樣的。這里稱12為“模”。
故有 3時(shí) - 6個(gè)小時(shí) = 3時(shí) + (12 - 6個(gè)小時(shí)),這里可以看到將減法轉(zhuǎn)換成加法的過(guò)程,即“加上模減去絕對(duì)值的差”。
所以,假設(shè)模是10,有效位數(shù)為1,當(dāng)我們計(jì)算 9 - 7 的時(shí)候:
9 - 7 => 9 + (10 - 7) = 12,去掉最高的位后,得到2,這是正確的結(jié)果。
作者的意思是說(shuō),計(jì)算機(jī)里面所有數(shù)都以補(bǔ)碼形式保存,加減運(yùn)算都是補(bǔ)碼之間的加法運(yùn)算。然后作者提出了一個(gè)我之前沒(méi)聽(tīng)過(guò)
的觀點(diǎn):
補(bǔ)數(shù) 和 補(bǔ)碼的定義式 里面,根本就沒(méi)有什么符號(hào)位。這最高位的1、0是自然出現(xiàn)的,并不是由人來(lái)規(guī)定的。
的確,符號(hào)位在補(bǔ)碼運(yùn)算里面是“模”,本身并不帶符號(hào)的意義。因?yàn)橛?jì)算機(jī)將加法轉(zhuǎn)換成加上一個(gè)“負(fù)數(shù)”,而負(fù)數(shù)又以補(bǔ)碼的形式
表現(xiàn)。補(bǔ)碼比源碼多一位,從這多出來(lái)的一位可以推斷出原來(lái)數(shù)字的正負(fù)號(hào),所以成為了符號(hào)位。也可以這樣認(rèn)為,留出一位
(不全部占滿)的原因是要用“模”來(lái)表示正負(fù)數(shù)。
也就是說(shuō),不是特意留出一個(gè)符號(hào)位,用1和0來(lái)表示正負(fù)號(hào)。而是補(bǔ)碼運(yùn)算可以用最高位來(lái)表示正負(fù),所以符號(hào)位誕生了。
那么為什么-128的補(bǔ)碼是10000000?可以這樣理解。-128是一個(gè)負(fù)數(shù),所以它的補(bǔ)碼是它的“模”減去它的絕對(duì)值,即:
100000000 - 10000000 = 10000000那么為什么負(fù)數(shù)補(bǔ)碼等于源碼的反碼加一呢?可以這樣推導(dǎo):
100000000 - 10000000 = (11111111 + 00000001) - 10000000 = 11111111 - 10000000 + 1 = 01111111 + 1 //反碼加一 = 10000000由此我們得知,在計(jì)算機(jī)里面所有的數(shù)字都以補(bǔ)碼形式存儲(chǔ)。127存成01111111,-127存成11111111,算減法就變成算加法了,
盡管你看到的是“-”號(hào)。
數(shù)字在自然界中抽象出來(lái)的時(shí)候,一棵樹,兩只豬,是沒(méi)有正數(shù)和負(fù)數(shù)的概念的
計(jì)算機(jī)保存最原始的數(shù)字,也是沒(méi)有正和負(fù)的數(shù)字,叫沒(méi)符號(hào)數(shù)字
如果我們?cè)趦?nèi)存分配4位(bit)去存放無(wú)符號(hào)數(shù)字,是下面這樣子的
后來(lái)在生活中為了表示“欠別人錢”這個(gè)概念,就從無(wú)符號(hào)數(shù)中,劃分出了“正數(shù)”和“負(fù)數(shù)”
正如上帝一揮手,從混沌中劃分了“白天”與“黑夜”
為了表示正與負(fù),人們發(fā)明了"原碼",把生活應(yīng)該有的正負(fù)概念,原原本本的表示出來(lái)
把左邊第一位騰出位置,存放符號(hào),正用0來(lái)表示,負(fù)用1來(lái)表示
但使用“原碼”儲(chǔ)存的方式,方便了看的人類,卻苦了計(jì)算機(jī)
我們希望 (+1)和(-1)相加是0,但計(jì)算機(jī)只能算出0001+1001=1010 (-2)
這不是我們想要的結(jié)果 (╯' - ')╯︵ ┻━┻
另外一個(gè)問(wèn)題,這里有一個(gè)(+0)和(-0)
?
為了解決“正負(fù)相加等于0”的問(wèn)題,在“原碼”的基礎(chǔ)上,人們發(fā)明了“反碼”
“反碼”表示方式是用來(lái)處理負(fù)數(shù)的,符號(hào)位置不變,其余位置相反
當(dāng)“原碼”變成“反碼”時(shí),完美的解決了“正負(fù)相加等于0”的問(wèn)題
過(guò)去的(+1)和(-1)相加,變成了0001+1110=1111,剛好反碼表示方式中,1111象征-0
人們總是進(jìn)益求精,歷史遺留下來(lái)的問(wèn)題—— 有兩個(gè)零存在,+0 和 -0
?
我們希望只有一個(gè)0,所以發(fā)明了"補(bǔ)碼",同樣是針對(duì)"負(fù)數(shù)"做處理的
"補(bǔ)碼"的意思是,從原來(lái)"反碼"的基礎(chǔ)上,補(bǔ)充一個(gè)新的代碼,(+1)
我們的目標(biāo)是,沒(méi)有蛀牙(-0)
有得必有失,在補(bǔ)一位1的時(shí)候,要丟掉最高位有得必有失,在補(bǔ)一位1的時(shí)候,要丟掉最高位
我們要處理"反碼"中的"-0",當(dāng)1111再補(bǔ)上一個(gè)1之后,變成了10000,丟掉最高位就是0000,剛好和左邊正數(shù)的0,完美融合掉了
這樣就解決了+0和-0同時(shí)存在的問(wèn)題
另外"正負(fù)數(shù)相加等于0"的問(wèn)題,同樣得到滿足
舉例,3和(-3)相加,0011 + 1101 =10000,丟掉最高位,就是0000(0)
同樣有失必有得,我們失去了(-0) , 收獲了(-8)
以上就是"補(bǔ)碼"的存在方式
?
結(jié)論:保存正負(fù)數(shù),不斷改進(jìn)方案后,選擇了最好的"補(bǔ)碼"方案
總結(jié)
以上是生活随笔為你收集整理的原码、反码、补码的产生、应用以及优缺点有哪些?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 每个开发阶段对应的最流行的Java工具
- 下一篇: Java常见的几种排序算法-插入、选择、