原碼 反碼和補碼 整數運算

2022-07-26 05:18:09 字數 1635 閱讀 7705

下文以8位整數為例,第一位表示符號位,0為正,1為負

編碼說明

所有整數的原碼、反碼、補碼都相同。負數的反碼和補碼的符號位都不改變,反碼其它位求反,補碼其它位求反後再加1。同乙個二進位制數在不同編碼中的解釋可能不同,一般來說,0開頭的8位資料在三種編碼中解釋相同,而以1開頭的則解釋不同

[+1]原=0000 0001,[+1]反=0000 0001,[+1]補=0000 0001

[-1]原=1000 0001,[-1]反=1111 1110,[-1]補=1111 1111

原碼表示的範圍是[-127~-0,+0~+127],反碼的範圍和原碼一致,補碼的範圍是[-128~0~+127],不同之處在於 1000 0000 在原碼中是-0,而在補碼中規定是-128,

[-127]補+[-1]補=[1000 0001]補+[1111 1111]補=[1000 0000]補

[+127]補+[+1]補=[0111 1111]補+[0000 0001]補=[1000 0000]補

符號位是1,所以就規定成-128。[0]補=[+1]補+[-1]補=[0000 0001]補+[1111 1111]補=[0000 0000]補。

整數運算的問題

所有整數運算全部可以化為加法,包括正正加,正負加,負負加,用原碼計算,正正結果一般是正確的,但是會有溢位,負負會把符號位加成0,而正負則結果根本就不對,例如

[+2]原+[-1]原= 0000 0010+1000 0001 = 1000 0011 = [-3]原

結果錯誤了,原因是符域和值域是分開計算的,要想乙個辦法讓他們一起參與運算。

補碼的來歷

我們考慮這樣一種運算,f(x)= x mod 2^n,這個運算我們總能保證f(x)的值不超過2^n,特別對於x如果是二進位制數,這個運算會非常簡單,我們只要保留x的最低n位即可,函式f就可以理解為取x的最低n位,加法運算可以保證封閉性,利用這個式子

f(x+y)=f(f(x)+f(y))

我們現在需要確定的是,給定x>0,f(-x)=?,就是負數的對映方式,根據f定義容易知道f(-x)=-f(x),而f(x)-f(x)=0,所以f(x)+f(-x)=0,上文我們強調我們所有的加法最終結果都要求f,即保證結果不超過2^n,所以f(x)+f(-x)=2^n也滿足我們的要求(和的最高位1被扔掉了),給定f(x),求f(-x)的方法實際就是,對f(x)按位求反然後加1,而我們發現這個就是求補碼的方法。

下面來看符號位如何參與計算,設x,y>0,8位二進位制數,7位值域,1位符號域,n=7,f(x)-f(y)=f(f(x)+2^n-f(y)),如果f(x)>f(y),那麼這個差應該是正數,而2^n正好和負數的符號位1相抵消,使得結果是負的;如果f(x)這種運算背後蘊含的數學道理和同餘有關,具體可以參考這兩篇帖子《原碼, 反碼, 補碼 詳解》,《[原創] 原碼,補碼和反碼》

另外,補碼運算中,正正和負負會出現溢位情況,而正負則一定不會出現,對於溢位的情況可以用雙符號位表示溢位情況,01表示兩正數相加「上溢」,10表示兩負數相加「下溢」,具體可以參考

第一篇總結日誌,還請大家多指出錯誤。

運算(原碼 補碼 反碼)

表示不帶符號向右移動二進位制數,移動後前面統統補0 兩個箭頭表示帶符號移動,沒有 這種運算子,因為左移都是補零,沒有正負數的區別。如 12 的二進位制為 1111 1111 1111 1111 1111 1111 1111 0100 12 3 即帶符號右移3位,結果是 1111 1111 1111 ...

原碼 反碼 補碼運算規則

在學習原碼,反碼和補碼之前,需要先了解機器數和真值的概念.1 機器數 乙個數在計算機中的二進位制表示形式,叫做這個數的機器數。機器數是帶符號的,在計算機用乙個數的最高位存放符號,正數為0,負數為1.比如,十進位制中的數 3 計算機字長為8位,轉換成二進位制就是00000011。如果是 3 就是 10...

原碼 反碼和補碼

數值有正負之分 計算機就用乙個數的最高位存放符號 0為正 1為負 這就是機器數的原碼了 假設機器能處理的位數為 8.即字長為 1byte,原碼能表示數值的範圍為 127 0 0 127 共256個.有了數值的表示方法就可以對數進行算術運算 但是很快就發現用帶符號位的原碼進行乘除運算時結果正確 而在加...