反碼和補碼在計算機中的作用是什麼?

alisa晶


反碼和補碼是為了解決減法問題借位的問題產生的,第一次是使用的1位補碼來解決的,但是由於0有兩種表示:0x00000000和0xffffffff,所以產生了2位補碼,即負數的補碼為反碼加1,正數的補碼為其自身,我們從十進制舉個例子25-89,本身有借位問題,換成補碼方法,25+(99-89)-100+1,其中99-89即是1位表示法的補碼,99-89+1即是2位表示法的補碼,所以求-89的補碼就是這樣的,如果轉換成二進制就成了二進制補碼,比如求-1的補碼,注意這裡得區分有符號數和無符號數,對於有符號數,最高位表示符號位,在求補碼過程中,符號位保持不變,所以1位表示法就是其反碼,為1……11111110,2位就是1……11111111,算法和十進制類似,由於1-0=1,1-1=0,所以負數反碼直接各位取反就行,2位補碼直接反碼+1和我們十進制補碼相符


啟個好名兒


這裡給大家找來最詳細和形象的解釋。

我們知道了計算機可以有三種編碼方式表示一個數. 對於正數因為三種編碼方式的結果都相同:

[+1] = [00000001]原 = [00000001]反 = [00000001]補

所以不需要過多解釋. 但是對於負數:

[-1] = [10000001]原 = [11111110]反 = [11111111]補

可見原碼, 反碼和補碼是完全不同的. 既然原碼才是被人腦直接識別並用於計算表示方式, 為何還會

有反碼和補碼呢?

首先, 因為人腦可以知道第一位是符號位, 在計算的時候我們會根據符號位, 選擇對真值區域的加減.

(真值的概念在本文最開頭). 但是對於計算機, 加減乘數已經是最基礎的運算, 要設計的儘量簡單.

計算機辨別"符號位"顯然會讓計算機的基礎電路設計變得十分複雜! 於是人們想出了將符號位也參與

運算的方法. 我們知道, 根據運算法則減去一個正數等於加上一個負數, 即: 1-1 = 1 + (-1) = 0 ,

所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡單了.

於是人們開始探索 將符號位參與運算, 並且只保留加法的方法. 首先來看原碼:

計算十進制的表達式: 1-1=0

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2

如果用原碼錶示, 讓符號位也參與計算, 顯然對於減法來說, 結果是不正確的.這也就是為何計算機內

部不使用原碼錶示一個數.

為了解決原碼做減法的問題, 出現了反碼:

計算十進制的表達式: 1-1=0

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111

1111]反 = [1000 0000]原 = -0

發現用反碼計算減法, 結果的真值部分是正確的. 而唯一的問題其實就出現在"0"這個特殊的數值上.

雖然人們理解上+0和-0是一樣的, 但是0帶符號是沒有任何意義的. 而且會有[0000 0000]原和[1000

0000]原兩個編碼表示0.

於是補碼的出現, 解決了0的符號以及兩個編碼的問題:

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]補 + [1111 1111]補 = [0000

0000]補=[0000 0000]原

這樣0用[0000 0000]表示, 而以前出現問題的-0則不存在了.而且可以用[1000 0000]表示-128:

(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]補 + [1000 0001]補 = [1000

0000]補

-1-127的結果應該是-128, 在用補碼運算的結果中, [1000 0000]補 就是-128. 但是注意因為實際上

是使用以前的-0的補碼來表示-128, 所以-128並沒有原碼和反碼錶示.(對-128的補碼錶示[1000 0000]

補算出來的原碼是[0000 0000]原, 這是不正確的)

使用補碼, 不僅僅修復了0的符號以及存在兩個編碼的問題, 而且還能夠多表示一個最低數. 這就是為

什麼8位二進制, 使用原碼或反碼錶示的範圍為[-127, +127], 而使用補碼錶示的範圍為[-128, 127].

因為機器使用補碼, 所以對於編程中常用到的32位int類型, 可以表示範圍是: [-231, 231-1] 因為第

一位表示的是符號位.而使用補碼錶示時又可以多保存一個最小值.


紳士平說


都答的比較複雜……我來簡短的說一下吧

反碼補碼的存在是因為早期計算機的硬件基礎問題了,由於早期技術不完善,所以計算機只能做加法運算

但是我們生活中還有減法啊!那怎麼辦呢?於是就誕生了反碼補碼。

而現在技術成熟了,加法運算器有了,但由於習慣與其他原因還在使用

現在,這些常用在,彙編語言,硬件基礎,電氣之類的方面

涉及彙編與信號的標識方面


舊事雲歸處


我說點有營養的,這個概念存在於Linux系統中,如果將來不從事Linux相關工作,這個概念不知道也無所謂,他不會對你的日後工作中起到作用,只會在你的心裡添加一個梗!

與其糾結這個概念,不如直接拿著鼠標百度一下!


分享到:


相關文章: