補碼運演算法則
A. 補碼運算
補碼相加後的結果:1010
1100
是答案的補碼,要轉化成原碼,才是最終答案.
補碼轉原碼方法同原碼轉補碼,即符號位不變,其餘按位取反後+1
1010
1100
求反:1101
0011
求補:1101
0100
即:-84
這里用到了補碼的運算規則:[X+Y]補=[X]補+[Y]補
求出[X]補+[Y]補後還要求一次補,才能得到答案X+Y
(1)補碼運演算法則擴展閱讀:
補碼運算原理: 在計算機里,如果我們要計算5-3的值,我們既可以用5減去3,也可以用5加上13。
這就像我們的鍾表,它從1點走到12點之後,又回到了1點。我們的計算機也是,從0走到15之後,再往下走就又回到了0,就像我們轉了一個圈一樣。我們從5這個位置往回退3個格,就完成了5-3這個計算。
我們也可以從5這個位置往前走,一直走到15,這時我們走了10個格,然後我們繼續往前走,走到0,然後到1,然後就走到了2。這樣,我們往前走了13個格之後,也到了2這個位置。
所以說,在我們這個計算機中,減3和加13是一樣的。而3+13=16,我們說在模16的系統下,3和13是互補的。
這樣,我們計算5-3就可以換成5+13。3的二進製表示為0011,5的二進製表示為0101。這樣,0101-0011就可以表示為0101+(-0011)。
我們在計算機中都是把負數用其補碼表示,-0011的補碼就是10000-0011(即16-3,也就是13)。10000-0011=1+1111-0011=1+(1111-0011)=1+1100=1101。
我們總說補碼是「按位取反再加一」,看了上面這個式子相信大家就會明白了,其實就是把10000-0011換成了1111-0011再加1的形式。
然後,0101-0011就換成了0101+1101,它們計算出來的結果為10010。由於我們的計算機只有四個bit,所以結果為0010。即,在模16的計算機中,5-3=5+13=2。
參考資料:補碼_網路
B. 補碼運算規則是什麼
對於正數,原碼反碼補碼都是一樣的,對於負數,不看符號位對於剩下求反。
就是把0變成1把1變成0,就是求反了,求反後+1再添上符號位.就得到了補碼,注意這里符號位是不參與取反與+1的10000001
首位(符號位)是1,這個數位負數。
取反:11111110加1
11111111結果為-127
(2)補碼運演算法則擴展閱讀:
正數
正整數的補碼是其二進製表示,與原碼相同。
例:+9的補碼是00001001。(備註:這個+9的補碼是用8位2進制來表示的,補碼表示方式很多,還有16位二進制補碼表示形式,以及32位二進制補碼表示形式,64位進制補碼表示形式等。每一種補碼表示形式都只能表示有限的數字。)
C. 補碼的加法是怎麼算的
計算機內部加法和減法一律按照補碼相加(減)計算的
45的補碼(等於原碼):00101101
-83的補碼(原碼除符號位不變,其餘位取反;+1):10101101
兩者相加,得:11011010
最後還原成原碼:(先-1,再符號位不變,按位取反,得:10100110=>-38)。
D. 二進制補碼怎麼計算的
1、正數的補碼表示:
正數的補碼 = 原碼
負數的補碼 = {原碼符號位不變} + {數值位按位取反後+1} or
= {原碼符號位不變} + {數值位從右邊數第一個1及其右邊的0保持不變,左邊安位取反}
以十進制整數+97和-97為例:
+97原碼 = 0110_0001b
+97補碼 = 0110_0001b
-97原碼 = 1110_0001b
-97補碼 = 1001_1111b
2、純小數的原碼:
純小數的原碼如何得到呢?方法有很多,在這里提供一種較為便於筆算的方法。
以0.64為例,通過查閱可知其原碼為0.1010_0011_1101_0111b。
操作方法:
將0.64 * 2^n 得到X,其中n為預保留的小數點後位數(即認為n為小數之後的小數不重要),X為乘法結果的整數部分。
此處將n取16,得
X = 41943d = 1010_0011_1101_0111b
即0.64的二進製表示在左移了16位後為1010_0011_1101_0111b,因此可以認為0.64d =0.1010_0011_1101_0111b 與查詢結果一致。
再實驗n取12,得
X = 2621d = 1010_0011_1101b 即0.64d =0.1010_0011_1101b,在忽略12位小數之後的位數情況下,計算結果相同。
3、純小數的補碼:
純小數的補碼遵循的規則是:在得到小數的源碼後,小數點前1位表示符號,從最低(右)位起,找到第一個「1」照寫,之後「見1寫0,見0寫1」。
以-0.64為例,其原碼為1.1010_0011_1101_0111b
則補碼為:1.0101_1100_0010_1001b
當然在硬體語言如verilog中二進製表示時不可能帶有小數點(事實上不知道哪裡可以帶小數點)。
4、一般帶小數的補碼
一般來說這種情況下先轉為整數運算比較方便
-97.64為例,經查詢其原碼為1110_0001.1010_0011_1101_0111b
筆算過程:
-97.64 * 2^16 = -6398935 =1110_0001_1010_0011_1101_0111b,其中小數點在右數第16位,與查詢結果一致。
則其補碼為1001_1110_0101_1100_0010_1001b,在此採用負數的補碼 = {原碼符號位不變} + {數值位按位取反後+1} 方法
5、補碼得到原碼:
方法:符號位不動,幅度值取反+1or符號位不動,幅度值-1取反
-97.64補碼 =1001_1110(.)0101_1100_0010_1001b
取反 =1110_0001(.)1010_0011_1101_0110b
+1 =1110_0001(.)1010_0011_1101_0111b 與查詢結果一致
6、補碼的拓展:
在運算時必要時要對二進制補碼進行數位拓展,此時應將符號位向前拓展。
-5補碼 = 4'b1011 = 6'b11_1011
ps.原碼的拓展是將符號位提到最前面,然後在拓展位上部0.
-5原碼 = 4『b』1101 = 6'b10_0101,對其求補碼得6'b11_1011,與上文一致。
(4)補碼運演算法則擴展閱讀:
計算機中的符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示「正」,用1表示「負」,而數值位,三種表示方法各不相同。
在計算機系統中,數值一律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。
E. 什麼是補碼,怎麼計算
無論什麼類型的數字,在計算機中,都是以「二進制代碼」存儲的。
下面按照八位二進制來說明,其它位數,自行腦補。
十進制數 0,存放的,就是二進制 0000 0000。
十進制數 +1,就加上 1,二進制是 0000 0001。
十進制數 +2,就再加 1,二進制是 0000 0010。
。。。
十進制數 +127,加 1加 1...,就加到了 0111 1111。
+127,這就是最大數值。
----------
負數怎麼辦?你就從 0,依次遞減吧。
十進制數 0,以二進制 0000 0000 存放。
十進制數 -1,就減去 1,得 1111 1111 = 255(十進制)。
十進制數 -2,就再減 1,得 1111 1110 = 254。
十進制數 -3,就再減 1,得 1111 1101 = 253。
。。。
十進制數 -128,減 1減 1...,得 1000 0000 = 128。
不要再減了,這就是最小值了。
(你再繼續減,就是 0111 1111,這就是+127 了。)
因此,最小數就是-128。
----------
總結:
零和正數:直接用二進制存放。
負數:存放形式是【256+這個負數】。
這套存放格式,就是所謂的【補碼】。
求【補碼】,就是這么簡單。
完全不用繞到「原碼反碼符號位」那麼遠。
可以用十進制來計算。如果需要二進制,你就再轉換一下。
用這個方法,不涉及原碼反碼符號位,就少了不少麻煩事。
----------
為什麼負數用補碼存儲?
利用補碼,可以把減法運算,轉換成加法。
(所以,在計算機中,有一個加法器,就夠用了。)
例如,6-2 = 4,用補碼運算如下:
6 的補碼是 0000 0110
+-2 的補碼是 1111 1110
-----------------
(1)0000 0100 (= 4 的補碼)
(括弧中的 1,是進位,舍棄不要了。)
注意:
如果運算結果超出了-128~+127 的范圍,結果將是錯的。
這種現象稱為「溢出」。
再注意一下:進位,並不等於溢出。
---------
因為補碼的這個特性,所以,在計算機中,只是使用補碼存放數據。
而原碼反碼,在計算機中,都是不存在的。
原碼反碼 的用途,僅僅是用於「心算、筆算」。
其實,筆算的方法,並非只有「取反加一」。
另外,-128,有補碼,但是卻沒有原碼反碼!
用「取反加一」來求-128 的補碼,無異於緣木求魚。
所以,大家,完全不必在原碼反碼 上浪費時間精力。
但是,考試怎麼辦?
呃 ...,還是別跟老師較勁,他怎麼亂講,你就怎麼答吧。
F. 總結原碼,反碼和補碼的表示方法和運算規則.為什麼在計算機中大多採用補碼
在計算機系統中,正負數值,一律採用補碼來表示和儲存。
原碼和反碼,在計算機中,都是不存在的。
補碼,就是一個【代替負數運算的正數】。
利用補碼,減法就可以用加法運算代替了。
計算機中,只要配置一個加法器,就可以加、減通用了。
原碼和反碼,都沒有這種功能,所以,計算機中不使用它們。
----------------------
正數,怎麼就能代替負數呢?
且看 2 位 10 進制:
25 - 1 = 24
25 + 99 = (一百) 24
只要舍棄進位,+99 就能當做-1 使用。
+99 就稱為-1 的補數。
計算公式: 補數 = 負數 + 10^n,n 是位數。
----------------------
計算機用二進制,補數,就改稱為:補碼。
8 位 2 進制的范圍:0000 0000~1111 1111(十進制 255)。
求補碼的計算公式:
負數的補碼 = 負數 + 2^8 = 負數 + 256。
正數,不需任何變換,直接就可以進行計算。
所以,正數,並不存在補碼。
-1 的補碼是:-1 + 256 = 255 = 1111 1111。
-2 的補碼是:-2 + 256 = 254 = 1111 1110。
。。。
-128 的補碼是: 128 = 1000 0000。
----------------------
運算實例: 7 - 2 = 5,用補碼計算如下:
7 =0000 0111
-2 的補碼 =1111 1110
---相加-----------
得:(1)0000 0101= 5
舍棄進位,結果,就完全正確。
----------------------
補碼,就是補碼,與原碼反碼毫無關系。
從「取反加一」來學習補碼,不但不能理解補碼的意義,而且還難以求出-128 的補碼。
為了解釋-128 的補碼,還得編造許多瞎話。
G. 二進制補碼怎麼算
1、在計算機系統中,數值一律用補碼來表示(存儲)。 主要原因:使用補碼,可以將符號位和其它位統一處理;同時,減法也可按加法來處理。另外,兩個用補 碼表示的數相加時,如果最高位(符號位)有進位,則進位被舍棄。 2、補碼與原碼的轉換過程幾乎是相同的。 數值的補碼表示也分兩種情況: (1)正數的補碼:與原碼相同。 例如,+9的補碼是00001001。 (2)負數的補碼:符號位為1,其餘位為該數絕對值的原碼按位取反;然後整個數加1。 例如,-7的補碼:因為是負數,則符號位為「1」,整個為10000111;其餘7位為-7的絕對值+7的原碼 0000111按位取反為1111000;再加1,所以-7的補碼是11111001。 已知一個數的補碼,求原碼的操作分兩種情況: (1)如果補碼的符號位為「0」,表示是一個正數,所以補碼就是該數的原碼。 (2)如果補碼的符號位為「1」,表示是一個負數,求原碼的操作可以是:符號位為1,其餘各位取 反,然後再整個數加1。 例如,已知一個補碼為11111001,則原碼是10000111(-7):因為符號位為「1」,表示是一個負 數,所以該位不變,仍為「1」;其餘7位1111001取反後為0000110;再加1,所以是10000111。 在「閑扯原碼、反碼、補碼」文件中,沒有提到一個很重要的概念「模」。我在這里稍微介紹一下「模」 的概念: 「模」是指一個計量系統的計數范圍。如時鍾等。計算機也可以看成一個計量機器,它也有一個計量范 圍,即都存在一個「模」。例如: 時鍾的計量范圍是0~11,模=12。 表示n位的計算機計量范圍是0~2(n)-1,模=2(n)。【註:n表示指數】 「模」實質上是計量器產生「溢出」的量,它的值在計量器上表示不出來,計量器上只能表示出模的 余數。任何有模的計量器,均可化減法為加法運算。 例如: 假設當前時針指向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(9位),但因只有8位,最高位1自然丟失。又回了00000000,所以8位二進制系統的 模為2(8)。 在這樣的系統中減法問題也可以化成加法問題,只需把減數用相應的補數表示就可以 了。把補數用到計算機對數的處理上,就是補碼。 另外兩個概念 一的補碼(one's complement) 指的是正數=原碼,負數=反碼 而二的補碼(two's complement) 指的就是通常所指的補碼