原碼反碼補碼移碼的目的

2021-10-05 17:53:31 字數 4355 閱讀 6252

不涉及定點、浮點運算。範圍僅在整數的資料表示裡。

使用比喻,使用相似的思維就可理解其共性,這篇我就想這麼寫。

計算方法是設計出來的,方法因為什麼要這樣設計的思維和目的才是我們學習時的主線。

唐朔飛那本教材太高估我的智商,上來就是小數的,補碼的全是抽象的計算,都不給幾個例子(這,給初學者的教材?)……

我們先用8位二進位制數來表示數值

真值原碼

補碼(負數時,反碼+1)

反碼(負數時,原碼除了符號位都取反)

移碼 (補碼符號位抄取反)

-51,000 0101

1,111 1011

1,111 1010

0,111 1011

+50,000 0101

0,000 0101

0,000 0101

1,000 0101

注意,「逗號」用於區分符號位和其他位,實際並不存在。

1.符號位會參與運算

2.所有減法運算都需要變成加法

3.有限的儲存位數

解決問題1的原理——對映

人為規定從[-128, 127]到[0, 255]的對映,就可以"僅用正數表示負數"

再規定乙個易於直接比較大小的對映(移碼)便於比較大小。

解決問題2、3的原理——取模運算

取模後是「補」,加上對映後就對應了相應的正負數

取模本身就是一種位數限制

類似於角度數,

在同圓內60°= -300°,取模運算,此處模是360.(整數範圍內,從0到359,按照360=0算)

在一位元組8位內中除了符號位的7位,

1111 1111=0000 0000,取模運算,此處模是1 0000 0000(沒有超過這個模的數,十進位制下你見過某位是十的嗎?)

再放乙個**對比悟一下

碼原碼表示的真值(無符號位)

原碼表示的真值(有符號位)

補碼表示的真值(誰取反+1後是「碼」)

1111 1111

255-127

原碼1000 0001,表示-1

給出乙個數

3(十進位制)——真值

將3(十進位制)表示為二進位制

0011——無符號二進位制數

但是要考慮正負號怎麼辦?取最高位為符號位!

0,011——原碼

啊哈,那麼負3(十進位制)就是

1,011——原碼

我想算5(十進位制)-3(十進位制)怎麼辦?

0,101

1,011

這兩個數無法直接進行操作得結果!!

給乙個對映,正數仍是它本身,負數取模!讓負數加上它的取模的值等於1 0000!——實現從[-8,7]到[0, 15]的對映

(模是比最高位大一位的,如十進位制的模是10,沒有單個位能大於等於10)

補碼(為什麼按位取反再加一)

於是得-3(十進位制)的以1 0000為模的值=1 0000-1011=0 0101

0,101

符號位再按照負的來【1 0000=1111 +1,就可以看成「取反+1」】

1,101——補碼

6(十進位制)-3(十進位制)就可以是

0,110

1,101

求和就是10011,再對1 0000取模就是 0011(是個正補碼,正補碼等於原碼)。

0,011——計算結果的原碼(+3)

1(十進位制)-3(十進位制)就可以是

0,001

1,101

求和就是1110,再對1 0000取模就是 1110(是個負補碼)。【補碼計算後的仍是補碼10011,得結果原碼是負數時需要「減一取反」】

對1110「減一」可得1101,再「取反」可得1,010

1,010——計算結果的原碼(-2)

在原碼比較時

0,011(+3)

1,010(-2)

表示成無符號二進位制數時

0011(3)

1010(10)

顯然是不合常理的

鑑於邊界值都規定好了,可以確定1打頭的都是負數、0打頭的都是整數——換一下不就好了??

1011—— +3的移碼

0010—— -2的移碼

這樣,原碼在無符號二進位制數的對映就是合理的了

摘自:原碼、反碼、補碼的產生、應用以及優缺點有哪些?——何新宇

補碼來歷的描述,可以總結如下:

1.計算機裡面,只有加法器,沒有減法器,所有的減法運算,都必須用加法進行

2.用補數代替原數,可把減法轉變為加法。

3.出現的進製就是模,此時的進製,就應該忽略不計。

4.二進位制下,有多少位數參加運算,模就是在 1 的後面加上多少個 0。

補碼就是按照這個要求來定義的:正數不變,負數即用模減去絕對值。

摘自:原碼、反碼、補碼的產生、應用以及優缺點有哪些?——張天行

所謂原碼就是機器數,是加了一位符號位的二進位制數,正數符號位為0,負數符號位為1,計算機中儲存、處理、運算的資料通常是8位、16位、32位或64位的,這裡以最簡單的8位為例講解。注意符號位是包含在8位中的其中1位,故可直觀讀出的數只有7位(只有後7位數可以按權展開)。有心人可能注意到原碼是有缺陷的,它只能表示255種狀態,因為00000000(+0)和10000000(-0)其實是乙個數,因此原碼的表示範圍成了-127到+127,這個問題需要神奇的補碼來解決,因為在補碼中10000000被用來表示-128。

所謂反碼,英語裡又叫ones』 complement(對1求補),這裡的1,本質上是乙個有限位計數系統裡所能表示出的最大值,在8位二進位制裡就是11111111,在1位十進位制裡就是9,在3位十六進製制裡就是fff(再大就要進製了)。求反又被稱為對一求補,用最大數減去乙個數就能得到它的反,很容易看出在二進位制裡11111111減去任何數結果都是把這個數按位取反,0變1,1變零,所以才稱之為反碼。用原碼求反碼的方法是,正數不變,負數保留符號位1不變,剩下位按位取反。

所謂補碼,英語裡又叫two』s complement(對2求補),這個2指的是計數系統的容量(模),就是計數系統所能表示的狀態數。對1位二進位制數來說只有0和1兩種狀態,所以模是10也就是十進位制的2,對7位二進位制數來說就是10000000,這個模是不可能取到的,因為位數多一位。用模減去乙個數(無符號部分)就能得到這個數的補,比如10000000-1010010=0101110,事實上因為10000000=1111111+1,稍加改變就成了(1111111-1010010)+1,所以又可以表述為先求反再加1。總結求補碼的方法就是正數依舊不變,負數保留符號位不變,先求反碼再加上1。

記住了怎麼求補碼,接下來講講運算。通過原碼的符號位和數值,我們能迅速指出它代表的數,判斷其正負並進行四則運算,相比而言反碼和補碼對於人則顯得過於晦澀。如果說原碼是給人看的數字語言,那麼補碼就是計算機的數字語言。計算機不需要知道什麼是正負、大小,這些判斷對它而言過於複雜。事實上它儲存、處理、傳輸的數都只有補碼一種形式,人所做的加減乘除,在計算機裡只通過相加和移位就能解決,這都來自於補碼系統的內在自洽和巧奪天工的神奇魔力,也是後文要闡述的重點。

對加法和減法,按上文的方法求得補碼之後,直接相加就可以了,但相加的時候符號位一定要一起參與運算,有時候,兩符號位相加或者接受來自低位的進製會發生溢位,就扔掉溢位的一位(稍後會解釋為什麼),由新的符號位決定結果的正負,如果是0表示正數,結果就是原碼,如果是1表示負數,結果還要再求補數得到原碼。

摘自:補碼對應128

將負數用補碼表示,實際上是實現了一種從[-128, 127]到[0, 255]的對映。如下所示:

+----------------------------+

| 255 -1 11111111 |

| 254 -2 11111110 |

| 246 -10 11110110 |

| 156 -100 10011100 |

| 129 -127 10000001 |

| 128 -128 10000000 |

| 127 127 01111111 |

| 100 100 01100100 |

| 10 10 00001010 |

| 2 2 00000010 |

| 1 1 00000001 |

| 0 0 00000000 |

+----------------------------+

原碼,補碼,反碼,移碼

為什麼有這些碼 定義機器字長為n,若數值x是純整數 若數值x是純小數,對純小數的原碼計算是先將其轉換為二進位制 必須的 例 若機器字長為8,則 1 原 0 0000001 1 原 1 0000001 7 原 0 0000111 127 0 1111111 127 原 1 1111111 7 原 1 ...

原碼,反碼,補碼,移碼

移碼 又叫增碼 是符號位取反的補碼,先將符號位取反,再取補碼,意思就是正數只將 變為1,負數將 變為0,再取補 x 1011 x 移 11011 符號位 1 表示正號 x 1011 x 移 00101 符號位 0 表示負號 一般用做浮點數的階碼,引入的目的是為了保證浮點數的機器零為全0。一 原碼 求...

原碼 反碼 補碼 移碼

如果機器字長為n,那麼乙個數的原碼就是用乙個n位的二進位制數,其中最高位為符號位 正數為0,負數為1。剩下的n 1位表示概數的絕對值。例如 x 101011 x 原 00101011 x 101011 x 原 10101011 位數不夠的用0補全。ps 正數的原 反 補碼都一樣 0的原碼跟反碼都有兩...