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