1. 程式人生 > >模,原碼,補碼,反碼

模,原碼,補碼,反碼

模、原碼和補碼

在實際生活中,如果一個物體在正北方向30度,把該物體順時針旋轉100度,和把這個物體逆時針旋轉260度得到的效果是一樣的。再比如說鐘錶,時針從2點走11個單位,和逆時針走1個單位的位置是一樣的。這兩個例子有個共同的特點,物體和時針都被限制在了一定的範圍內,想要取到一個位置,都有兩種方式。

  • 第一個例子中30 + 100 的位置與 30 - (360 - 100)的位置是一樣的。
  • 第二個例子中,2 + 11並沒有等於13,而是等於1,因為超過了一定範圍以後,就會將計算結果減去這個“一定範圍”的整數倍,使最終結果控制在這個範圍裡面。所以2 + 11與 2 - (12-11)的時鐘位置是一樣的。

類比這兩個例子,可以理解計算機中模的概念。例子中的“一定範圍”就是。兩個例子裡面的100與360-100的關係、11與12-11的關係就相當於計算機中的原碼補碼


舉例:

在第一個例子中,-30度可以表示為360-30度。那麼同樣,在計算機中,一個8位的二進位制數的模就是 1 0000 0000(2^8=256)。-3可以表示為256-3。
  • -3的原碼是10000011
  • 3的原碼是00000011
  • -3=256-3表示為1 00000000 - 00000011 = 11111101
  • 11111101就是-3的補碼。

得到的結果11111101就被叫做-3的補碼10000011(-3的原碼)11111101(-3的補碼)就相當於-30度與330度的關係,雖然長得不一樣,但是在二進位制計算中表達的意義是一樣的。這樣11111101

就可以代替10000011(-3的原始碼)進行計算機中的二進位制計算。


補碼存在的意義

反碼的存在可以讓計算機表示十進位制中的負數,並且可以讓計算機在運算時只做加法不做減法。

例如:10-3 = 10 + (-3)

在模的範圍裡,一個數本身與其補碼具有相同的意義。在實際計算10+(-3)時相當於10的原碼 + (-3的補碼)的過程。(如果此時你有個疑問,為什麼不直接用-3的原始碼來計算10+(-3),看了下面負數的原碼的定義就知道了。)


負數的原碼

八位二進位制數0000 0000 ~1111 1111,一共可以表示2^8=256位數。如果想要表示有符號整數,就要將最前面一個二進位制位作為符號位,即0代表正數,1代表負數,後面7位為數值域,這就是原碼

定義。

  • 這也就是為什麼8位的二進位制能表示十進位制數的範圍是-128~+127

  • 而計算機在計算負數的加法不能用負數的原始碼計算也是因為原碼定義。例如上面的10+(-3),不能用-3的原始碼計算,是因為-3的原碼與3的原碼只差了一個符號位,數值部分其實是和3,這樣計算的結果顯然是不對的,所以要求-3的補碼,用補碼來進行計算。

  • 負數在計算機計算時,都是使用其補碼來進運算的。

反碼

原碼的符號位不變,二進位制取反得到結果,只是計算機為了計算補碼時的一箇中間量。

各種碼的計算方法

  • 原碼:符號位加上真實數值的絕對值的二進位制, 即用第一位表示符號, 其餘位表示數值。
  • 反碼:正數的反碼是其本身;負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反。
  • 補碼:正數的補碼就是其本身;負數的補碼是在反碼的基礎上+1。

上面例子中提到的求補碼的方法是,用模的值減去負數的絕對值,那個模對應的二進位制1 0000 0000是9位的,而8位的二進位制是無法表示這個模的。計算機計算補碼的真正辦法是將原碼的符號位不變,二進位制取反加1