⑴ 什麼是一個數的原碼,反碼,補碼
基本概念
在計算機內部表示二進制數的方法稱為數值編碼,把一個數及其符號在機器中的表示加以數值化,稱為機器數。機器數所代表的數稱為數的真值。 表示一個機器數,應考慮以下三個因素:
1.機器數的范圍
字長為8位,無符號整數的最大值是(11111111)B=(255)D,此時機器數的范圍是0~255。
字長為16位,無符號整數的最大值是
(1111111111111111)B=(FFFF)H=(65535)D 此時機器數的范圍是0~65535。
2.機器數的符號
在算術運算中,數據是有正有負的,將這類數據稱為帶符號數。
為了在計算機中正確地表示帶符號數,通常規定每個字長的最高位為符號位,並用0表示正數,用1表示負數。
3.機器數中小數點的位置
在機器中,小數點的位置通常有兩種約定:
一種規定小數點的位置固定不變,這時的機器數稱為「定點數」。
另一種規定小數點的位置可以浮動,這時的機器數稱為「浮點數」。
4.原碼
正數的符號位為0,負數的符號位為1,其它位按照一般的方法來表示數的絕對值。用這樣的表示方法得到的就是數的原碼。
【例1】當機器字長為8位二進制數時:
X=+1011011 [X]原碼=01011011
Y=+1011011 [Y]原碼=11011011
[+1]原碼=00000001 [-1]原碼=10000001
[+127]原碼=01111111 [-127]原碼=11111111
原碼表示的整數范圍是:
-(2n-1-1)~+(2n-1-1),其中n為機器字長。
則:8位二進制原碼表示的整數范圍是-127~+127
16位二進制原碼表示的整數范圍是-32767~+32767
5.反碼
對於一個帶符號的數來說,正數的反碼與其原碼相同,負數的反碼為其原碼除符號位以外的各位按位取反。【例2.14】當機器字長為8位二進制數時:
X=+1011011 [X]原碼=01011011 [X]反碼=01011011
Y=-1011011 [Y]原碼=11011011 [Y]反碼=10100100
[+1]反碼=00000001 [-1]反碼=11111110
[+127]反碼=01111111 [-127]反碼=10000000
負數的反碼與負數的原碼有很大的區別,反碼通常用作求補碼過程中的中間形式。 反碼表示的整數范圍與原碼相同。
6.補碼
正數的補碼與其原碼相同,負數的補碼為其反碼在最低位加1。
【例2】(1)X=+1011011 (2) Y=-1011011
(1)根據定義有: [X]原碼=01011011 [X]補碼=01011011
(2) 根據定義有: [Y]原碼=11011011 [Y]反碼=10100100
[Y]補碼=10100101
補碼表示的整數范圍是-2n-1~+(2n-1-1),其中n為機器字長。
則:8位二進制補碼表示的整數范圍是-128~+127
16位二進制補碼表示的整數范圍是-32768~+32767
當運算結果超出這個范圍時,就不能正確表示數了,此時稱為溢出。
7.補碼與真值之間的轉換
正數補碼的真值等於補碼的本身;負數補碼轉換為其真值時,將負數補碼按位求反,末位加1,即可得到該負數補碼對應的真值的絕對值。
【例3】[X]補碼=01011001B,[X]補碼=11011001B,分別求其真值X。
(1)[X]補碼代表的數是正數,其真值:
X=+1011001B
=+(1×26+1×24+1×23+1×20)
=+(64+16+8+1)
=+(89)D
(2)[X]補碼代表的數是負數,則真值:
X=-([1011001]求反+1)B
=-(0100110+1)B
=-(0100111)B
=-(1×25+1×22+1×21+1×20)
=-(32+4+2+1)
=-(39)D
⑵ C語言中已知機器碼如何求原碼
數值在計算機中表示形式為機器數,計算機只能識別0和1,使用的是二進制,而在日常生活中人們使用的是十進制,"正如亞里士多德早就指出的那樣,今天十進制的廣泛採用,只不過我們絕大多數人生來具有10個手指頭這個解剖學事實的結果.盡管在歷史上手指計數(5,10進制)的實踐要比二或三進制計數出現的晚."(摘自<<數學發展史>>有空大家可以看看哦~,很有意思的).為了能方便的與二進制轉換,就使用了十六進制(2 4)和八進制(23).下面進入正題. 數值有正負之分,計算機就用一個數的最高位存放符號(0為正,1為負).這就是機器數的原碼了.假設機器能處理的位數為8.即字長為1byte,原碼能表示數值的范圍為 (-127~-0 +0~127)共256個. 有了數值的表示方法就可以對數進行算術運算.但是很快就發現用帶符號位的原碼進行乘除運算時結果正確,而在加減運算的時候就出現了問題,如下: 假設字長為8bits ( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10 (00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 顯然不正確. 因為在兩個整數的加法運算中是沒有問題的,於是就發現問題出現在帶符號位的負數身上,對除符號位外的其餘各位逐位取反就產生了反碼.反碼的取值空間和原碼相同且一一對應. 下面是反碼的減法運算: ( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10 (00000001) 反+ (11111110)反 = (11111111)反 = ( -0 ) 有問題. ( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10 (00000001) 反+ (11111101)反 = (11111110)反 = ( -1 ) 正確 問題出現在(+0)和(-0)上,在人們的計算概念中零是沒有正負之分的.(印度人首先將零作為標記並放入運算之中,包含有零號的印度數學和十進制計數對人類文明的貢獻極大). 於是就引入了補碼概念. 負數的補碼就是對反碼加一,而正數不變,正數的原碼反碼補碼是一樣的.在補碼中用(-128)代替了(-0),所以補碼的表示範圍為: (-128~0~127)共256個. 注意:(-128)沒有相對應的原碼和反碼, (-128) = (10000000) 補碼的加減運算如下: ( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10 (00000001)補 + (11111111)補 = (00000000)補 = ( 0 ) 正確 ( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10 (00000001) 補+ (11111110) 補= (11111111)補 = ( -1 ) 正確 所以補碼的設計目的是: ⑴使符號位能與有效值部分一起參加運算,從而簡化運算規則. ⑵使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計 所有這些轉換都是在計算機的最底層進行的,而在我們使用的匯編、C等其他高級語言中使用的都是原碼。
⑶ 假定某台計算機的機器數佔8位計算出有符號十進制數-55的源碼,反碼和補碼
因為是8位,所以在符號位和數值位間加一個0
⑷ 機器數的機器數的原碼、反碼和補碼三種形式
4.1 原碼
將數的真值形式中「+」號用「0」表示,「-」號用「1」表示時,叫做數的原碼形式,簡稱原碼。若字長為n位,原碼一般可表示為:
(1)當X為正數時[X]原和X一樣,即[X]原 = X。當X為負數時 。由於X本身為負數,所以,實際上是將∣X∣數值部分絕對值前面的符號位上寫成「1」即可。
原碼表示法比較直觀,它的數值部分就是該數的絕對值,而且與真值、十進制數的轉換十分方便。但是它的加減法運算較復雜。當兩數相加時,機器要首先判斷兩數的符號是否相同,如果相同則兩數相加,若符號不同,則兩數相減。在做減法前,還要判斷兩數絕對值的大小,然後用大數減去小數,最後再確定差的符號,換言之,用這樣一種直接的形式進行加運算時,負數的符號位不能與其數值部分一道參加運算,而必須利用單獨的線路確定和的符號位。要實現這些操作,電路就很復雜,這顯然是不經濟實用的。為了減少設備,解決機器內負數的符號位參加運算的問題,總是將減法運算變成加法運算,也就引進了反碼和補碼這兩種機器數。
4.2 反碼
如前所述,為了克服原碼運算的缺點,採用機器數的反碼和補碼表示法。若字長為n位,反碼可表示為:
(2)即對正數來說,其反碼和原碼的形式相同;對負數來說,反碼為其原碼的數值部分各位變反。
4.3 補碼
補碼是根據同餘的概念引入的,我們來看一個減法通過加法來實現的例子。假定當前時間為北京時間6點整,有一隻手錶卻是8點整,比北京時間快了2小時,校準的方法有兩種,一種是倒撥2小時,一種是正撥10小時。若規定倒撥是做減法,正撥是做加法,那麼對手錶來講減2與加10是等價的,也就是說減2可以用加10來實現。這是因為8加10等於18,然而手錶最大隻能指示12,當大於12時12自然丟失,18減去12就只剩6了。這說明減法在一定條件下,是可以用加法來代替的。這里「12」稱為「模」,10稱為「-2」對模12的補數。推廣到一般則有:
A – B = A + ( – B + M ) = A + ( – B )補
(3)可見,在模為M的條件下,A減去B,可以用A加上-B的補數來實現。這里模(mole)可視為計數器的容量,對上述手錶的例子,模為12。在計算機中其部件都有固定的位數,若位數為n,則計數值為 ,亦即計數器容量為 ,因此計算機中的補碼是以「 」為模,其定義如下:
(4)簡言之,對正數來說,其補碼和原碼的形式相同;而從(3)式和(4)式可以看出,對於負數,補碼為其反碼的末位加1。
總之,正數的原碼、反碼和補碼是完全相同的;負數的原碼、反碼和補碼其形式各不相同。另外,特別要注意的是,對於負數的反碼和補碼(即符號位為1的數),其符號位後邊的幾位數表示的並不是此數的數值。如果要想知道此數的大小,一定要求其反碼或補碼才行。
⑸ -9的機器數是10001001,則該數的原碼反碼補碼各是什麼
原碼:10001001
反碼:11110110
補碼:11110111
9的正確二進製表示法是: 00001001
當要表示-9時候,先對9的原碼取反,變成11110110,,即反碼,反碼基礎上加1為11110111,則是-9的補碼。
(5)每一個機器數都有源碼擴展閱讀:
原碼(true form)是一種計算機中對數字的二進制定點表示方法。原碼表示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1(0有兩種表示:+0和-0),其餘位表示數值的大小。
編碼方式:
原碼是有符號數的最簡單的編碼方式,便於輸入輸出,但作為代碼加減運算時較為復雜。
一個字長為n的機器數能表示不同的數字的個數是固定的2^n個,n=8時2^n=256;用來表示有符號數,數的范圍就是-(2^(n-1)-1)~+2^(n-1)-1,n=8是這個范圍就是-127~+127。
計算機中的有符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示「正」,用1表示「負」,而數值位,三種表示方法各不相同。
在計算機系統中,數值一律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。
補碼的特性:
1,一個負整數(或原碼)與其補數(或補碼)相加,和為模。
2,對一個整數的補碼再求補碼,等於該整數自身。
3,補碼的正零與負零表示方法相同。
參考資料來源:網路-補碼
⑹ 機器數的原碼,反碼,補碼,移碼
所謂原碼就是二進制定點表示法,即最高位為符號位,「0」表示正,「1」表示負,其餘位表示數值的大小。反碼表示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。補碼表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。
⑺ 設機器數為8位,已知Y=-42,請分別寫出Y的原碼,反碼,補碼
42(10)=101010(2)
-42(10)源碼= 1(符號位 1代表負;0代表正) 0(不足7位補0)101010
反碼= 1(符號位無需變反) 1010101(數值位變反)
補碼= 1 1010110(二進制加一)
1010101
+0000001
-------------
1010110
1+1=10(進一)
1+0=1
0+0=0