原码、补码、反码详解
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
原碼、補(bǔ)碼、反碼詳解:LUKE 2017-11-13
1.原碼:(True Form)*****************************************
?? ?是對計(jì)算機(jī)中的數(shù)字進(jìn)行定點(diǎn)表示。最高位是符號位,其余為表示數(shù)值位。
注:
?? ?計(jì)算機(jī)中所有的數(shù)均用0,1編碼表示,數(shù)字的正負(fù)號也不例外,如果一個機(jī)器數(shù)字長是n位的話,
?? ?約定最左邊一位用作符號位,其余n-1位用于表示數(shù)值。
?? ?在符號位上用"0"表示正數(shù);用"1"表示負(fù)數(shù)。數(shù)值位表示真值的絕對值。凡不足n-1位的,小數(shù)在
?? ?最低位右邊加零;整數(shù)則在最高位左邊加零以補(bǔ)足n-1位。這種計(jì)算機(jī)的編碼形式叫做原碼。
原碼的優(yōu)缺點(diǎn):
?? ?優(yōu)點(diǎn):
?? ??? ?簡單直觀;例如,我們用8位二進(jìn)制表示一個數(shù),+11的原碼為00001011,-11的原碼就是10001011
?? ?缺點(diǎn):
?? ??? ?原碼不能直接參加運(yùn)算,可能會出錯。
?? ??? ?例如數(shù)學(xué)上,1+(-1)=0,而在二進(jìn)制中原碼00000001+10000001=10000010,換算成十進(jìn)制為-2。
?? ??? ?顯然出錯了。所以原碼的符號位不能直接參與運(yùn)算,必須和其他位分開,這就增加了硬件的開銷和復(fù)雜性
2.補(bǔ)碼:*****************************************
注:在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來表示和存儲。原因在于,使用補(bǔ)碼,可以將符號位和數(shù)值域統(tǒng)一處理;
?? ?同時,加法和減法也可以統(tǒng)一處理。此外,補(bǔ)碼與原碼相互轉(zhuǎn)換,其運(yùn)算過程是相同的,不需要額外的硬件電路。
特點(diǎn):
?? ?1、一個負(fù)整數(shù)(或原碼)與其補(bǔ)數(shù)(或補(bǔ)碼)相加,和為模。
?? ?2、對一個整數(shù)的補(bǔ)碼再求補(bǔ)碼,等于該整數(shù)自身。
?? ?3、補(bǔ)碼的正零與負(fù)零表示方法相同。
補(bǔ)碼和原碼的相互轉(zhuǎn)換:
?? ?補(bǔ)碼 -> 原碼:
?? ??? ??? ??? ?⑴如果補(bǔ)碼的符號位為“0”,表示是一個正數(shù),其原碼就是補(bǔ)碼。
?? ??? ??? ??? ?⑵如果補(bǔ)碼的符號位為“1”,表示是一個負(fù)數(shù),那么求給定的這個補(bǔ)碼的補(bǔ)碼就是要求的原碼。
?? ??? ??? ??? ??? ?(最高符號位不變,數(shù)值位取反,再加1就是原碼。)
?? ?原碼 -> 補(bǔ)碼:
?? ??? ??? ??? ?⑴如果原碼的符號位為“0”,表示是一個正數(shù),其補(bǔ)碼就是原碼。
?? ??? ??? ??? ?⑵如果原碼的符號位為“1”,表示是一個負(fù)數(shù),就是原碼先減1,符號位不變,再數(shù)值位取反就是補(bǔ)碼。
舉例:-7 : 1000 0111(原碼)
?? ??? ? ? 減1
?? ??? ? ? 1000 0110
?? ??? ? ? 符號位不變,再數(shù)值位取反
?? ??? ? ? 1111 1001(補(bǔ)碼)
?? ??? ? ??
?? ??? ? ? 1111 1001(補(bǔ)碼)
?? ??? ? ? 取反,
?? ??? ? ? 1000 0110
?? ??? ? ? 符號位不變,加1
?? ??? ? ? 1000 0111(原碼)
?? ? ?
?? ? ?-1.1 :1000 0001.0000 0001(原碼)
?? ??? ??? ??? ?減1
?? ??? ??? ? 1000 0001.0000 0000
?? ??? ??? ??? ?符號位不變,再數(shù)值位取反
?? ??? ??? ? 1111 1110.1111 1111(補(bǔ)碼)
?? ??? ??? ??
?? ??? ??? ? 1111 1110.1111 1111(補(bǔ)碼)
?? ??? ??? ??? ?符號位不變,再數(shù)值位取反
?? ??? ??? ? 1000 0001.0000 0000
?? ??? ??? ??? ?加1
?? ??? ??? ? 1000 0001.0000 0001
(提示:代碼中的小數(shù)點(diǎn)”.”是在書寫時為了清晰起見加上去的,在機(jī)器中并不出現(xiàn)。)
(******提示:小數(shù)補(bǔ)碼的簡單計(jì)算方式:符號位保持不變,從右邊起第一個1以及1右邊的0保持不變,左邊的數(shù)值位按位取反。)
?? ??? ?
補(bǔ)碼的絕對值:
?? ?負(fù)數(shù)的補(bǔ)碼的絕對值計(jì)算:只要對補(bǔ)碼全部取反并加1,就可得到其數(shù)值。
?? ?舉例:-65 = 1*2^6+1*2^0
?? ??? ??? ??? ?1100 0001(原碼)
?? ??? ??? ??? ?減1
?? ??? ??? ??? ?1100 0000
?? ??? ??? ??? ?符號位不變,數(shù)值位取反
?? ??? ??? ??? ?1011 1111(補(bǔ)碼)
?? ??? ??? ?取絕對值:全部取反
?? ??? ??? ??? ?0100 0000
?? ??? ??? ??? ?加1
?? ??? ??? ??? ?0100 0001(結(jié)果為:+65的補(bǔ)碼)
補(bǔ)碼的加減法(略,簡單)
補(bǔ)碼的乘法:
?? ?(等比數(shù)列求和公式)
?? ??? ?a1 a2 a3...an
?? ??? ?q = an / a(n-1)
?? ??? ?an = a1 * q^(n-1)
?? ??? ?Sn = a1 + a2 + ... + an = a1 * (1 - qn) / (1 - q) = (a1 - an * q) / (1 - q)
3.反碼:*****************************************
?? ?反碼是數(shù)值存儲的一種,多應(yīng)用于系統(tǒng)環(huán)境設(shè)置,如linux平臺的目錄和文件的默認(rèn)權(quán)限的設(shè)置umask,
?? ?就是使用反碼原理。在計(jì)算機(jī)內(nèi),定點(diǎn)數(shù)有3種表示法:原碼、反碼和補(bǔ)碼。
?? ?所謂原碼就是二進(jìn)制定點(diǎn)表示法,即最高位為符號位,“0”表示正,“1”表示負(fù),其余位表示數(shù)值的大小。
?? ?
?? ?反碼表示法規(guī)定:正數(shù)的反碼與其原碼相同;負(fù)數(shù)的反碼是對其原碼逐位取反,但符號位除外。
?
轉(zhuǎn)載于:https://my.oschina.net/u/2607324/blog/1573217
總結(jié)
以上是生活随笔為你收集整理的原码、补码、反码详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置 VIM 英语字典
- 下一篇: Citrix XenServer Xen