計算機中的位操作 補碼 反碼 原碼

2021-07-13 12:38:32 字數 4094 閱讀 9126

計算機中的符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分。

在計算機中,數值一律用補碼來表示和儲存。原因在於,使用補碼可以將符號位和數值域同一處理;同時,加法和減法也可以統一處理。此外補碼和原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。

基本原理:

1. 乙個負數(或原碼)與其補數(補碼)相加,和為模。

2. 對乙個整數的補碼再求補碼等於該整數自身。

3. 補碼的正零與負零表示方法相同。

「模」是指乙個計量系統的計數範圍。如時鐘等。計算機可以看成乙個計量機器,它也有乙個範圍,即都存在乙個「模」。

例如:

時鐘的範圍是0-11,模=12 表示n為的計算機計量範圍是0~2^(n)-1,模=2^(n).

模實際上是計量器產生的溢位量,它的值在計量器上表示不出來,計量器只能表示出模的餘數。任何有mo的計量器,均可化減法為加法運算。

例如:假設當前時針指向10點,而準確時間是6點,調整時間可以有以下兩種撥法:一種是倒撥4小時,即10-4=6;另一種是順撥8小時:10+8=12+6=6.

在以12模的系統中,加8和減4效果是一樣的。因此凡是減4運算可以用加8來代替。對「模」而言,8和4互為補數,實際上,以12模的系統中,11和1,10和2,9和3,7和5,6和6都有這個特性。共同的特點是兩者相加等於模。

對於計算機,其概念和方法完全一樣。n位計算機,設n=8,所能表示的最大數為11111111,若再加1成為100000000,但因為只有8位,則最高位丟失。又回到了00000000,所以8位二進位制系統的模為2^8.在這樣的系統中減法問題也可以轉化為加法問題,只需把減數用相應的補數表示就可以了。把補數用到計算機對數的處理上,就是補碼。

1)正整數的補碼

正整數的補碼是其二進位制表示,與原碼相同。

2)負數的補碼

求負數的補碼,將其對應正數二進位製上表示所有位取反後加1.

eg:求-5的補碼:

-5對應正數5(00000101)->所有位取反(11111010)->加1(11111011)

所以-5的補碼是11111011

eg:數0的補碼表示是唯一的

[+0]補=[+0]反=[+0]原=00000000

[-0]補=11111111+1=00000000

3)補碼轉化為原碼:

已知乙個數的補碼,求原碼的操作就是對該補碼再求補碼:

 如果補碼的符號位為「0」,表示是乙個正數,則其原碼就是補碼。

 如果補碼的符號位為「1」,表示是乙個負數,那麼求給定這個補碼的補碼就是要求的原碼。

eg:已知乙個補碼為11111001,則原碼為10000111(-7).

因為符號位為「1」,表示是乙個負數,所以該位不變,仍為「1」。

其餘七位1111001取反後為0000110;再加1,所以是10000111.

4)補碼的絕對值

eg:-65的補碼是10111111

在計算機內,如果乙個二進位制數,其最左邊位是1,則我們可以判定它為負數,並且是用補碼表示。若要得到乙個負二進位制補碼的數值,只要對補碼全部取反並加1,就可以得到其數值。

10111111(-65的補碼)->(各位取反)->01000000->(加1)->01000001(+65)

1)補碼加法

[x+y]補=[x]補+[y]補

eg: x=+0110011(51),y=-0101001(-41),求[x+y]補

[x]補=00110011 [y]補=11010111

[x+y]補=[x]補+[y]補 = 00110011 + 11010111 = 00001010

注:因為計算機中運算器的位長是固定的(定長運算),上述運算中產生的最高位將丟掉,所以結果不是100001010而是00001010 = 10

2)補碼減法

[x-y]補 = [x]補-[y]補=[x]補+[-y]補

eg: 1-1[十進位制]

1的原碼:00000001 轉換為補碼是:00000001

-1的原碼:10000001 轉換為補碼是:11111111

1+(-1) = 00000001 + 11111111 = 00000000(0)

eg: -7-(-10)[十進位制]

-7的補碼:11111001 -(-10)的補碼:-10的原碼為10001010,-(-10)的原碼為:00001010

-(-10)的補碼就是其原碼:00001010

-7-(-10) = -7+10 = 11111001+00001010 = 00000011=3

3)補碼乘法

補碼的乘法不具備[x*y]補=[x]補*[y]補的性質。但是[x*y]補==[x]補*y,所得結果再取補碼。例如x=101,y=011. [x*y]補=

所有的位操作,操作的都是補碼。

1)左移操作

左移操作」<<」將證書最高位擠掉,而在右端補0。

左移就相當於乘2,而不管整形是否有符號。

eg: a = 12 求a<<1

a=12=00001100[補]

a<<1 = 00011000[補] = 16+8 = 24[十進位制]

2)右移操作

右移操作」>>」是在整數的高位擠進去乙個0或1進去,而整數右邊的1或0被擠掉。 對於有符號數,若最高位是1,則高位擠進1;最高位是0則擠進去0

eg: short int a = -2; 求 a>>1

a=-2的原碼是10000010->11111110 [補]

a>>1=11111111[補]->10000001[原] = -1[十進位制]

eg: short int a = 12; 求a>>1

a = 12 的原碼是00001100->00001100[補]

a>>1=00000110[補]->00000110[原]=6[十進位制]

右移就相當於除2,無論整形是否有符號。

3)位與操作

位與操作」&」是將兩個運算元每一位做與操作。

&操作是兩個數都為1的時候,結果才是1,否則為0

eg: int a = 12, b=6 求a&b

a=12= 00001100

b=6= 00000110

a&b= 00000100=4

eg: int a = -12,b=6 求a&b

a=-12= 10001100[原] ->11110100[補]

b=6= 00000110

a&b=00000100=4

eg: int a=-12,b=-6 求a&b

a=-12=10001100[原]->11110100[補]

b=-6 = 10000110[原] ->11111010[補]

a&b= 11110000[補]->10010000[原]->-16[十進位制]

4)位或操作

位或操作」|」是將兩個運算元的每一位做或操作。

|操作是兩個數中有乙個數為1則結果就是1,否則為0

eg:int a=12,b=6 求a|b

a=12= 00001100

b=6= 00000110

a|b= 00001110 = 14

eg: a=-12,b=-6 求a|b

a=-12= 11110100

b=-6= 11111010

a|b= 11111110[補]->10000010[原]=-2

5) 位異或操作

位異或」^」操作是將兩個運算元每一位做異或操作,異或也稱對稱和,或稱無進製加等,若兩個運算元相等(都為0或都為1,則其值為0,否則為1)。

eg: a=12,b=6 求a^b

a=12= 00001100

b=6= 00000110

a^b= 00001010=10

eg: a=-12,b=-6 求a^b

a=-12= 11110100

b=-6= 11111010

a^b= 00001110=14

6) 位反操作

位反」~」 操作是將乙個運算元每一位取反,0變成1,1變成0.

eg: int a=12 求a=~a

a= 12= 00001100

~a= 11110011->10001101=-13

計算機中原碼 反碼 補碼

首先要明白,在計算機中,數以二進位制的形式存在,其中有無符號數和有符號數 無符號數的,相當於十進位制中的自然數,沒有負數,因此八位無符號數的範圍 00000000 11111111,而有符號數的最高位表示符號,最高位為0表示整數 0000 0001 1 最高位為1表示負數 1000 0001 1 原...

計算機中的原碼 反碼和補碼

計算機中的原碼 反碼和補碼 看到這個標題,很多人有話要說了,切!這個東西每一本計算機基礎知識的書中都有介紹的,你還拿出來show什麼嘛!我的原則是你需要就來看一看,懂就不要去理會,倒也不必諷刺兩句,我相信總有需要它的人。當初我看書是沒看明白的,在網上查了好多資料才有所悟。前幾天跟老婆講原碼 反碼和補...

計算機中的原碼 反碼 補碼分析

今天給學生上數字邏輯第一節課,主要講了數制,後面簡單提及了原碼 反碼和補碼,碰到了兩個問題 第一,十進位制數轉八進位制數,學生練習時卡殼,不知道無從下手 第二,原本以為原碼 反碼 補碼應該是一年級甚至中學時就應該解決的問題,實際上原來根本不是這麼回事。中學老師即使講過,估計也是對付考試的方式簡單提及...