㈠ 如圖是87-(-73)的二進制補碼運算,可是最高位沒法借位了,請問該怎麼辦呢
最高位不夠減,「照借不誤」。
實際上要計算機內,加法有加法器實現,減法是轉換成補碼的加法(加上減數的相反數)來運算的。
㈡ 十進制的-73的補碼是多少
先說73,十進制的73轉為二進制:(73)10=64+8+1=2^6+2^3+2^0=(1001001)2,這里數一下二進制7位,正數的符號位是0,用8位表示的話,所以加上符號位後73的原碼=01001001,正數的反碼,補碼都和原碼一樣,所以都是01001001....
計算機中的負數是以其補碼形式存在的 補碼=原碼取反+1,也就是10110111
㈢ 二進制補碼怎麼計算的
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,與上文一致。
(3)73二進制補碼運演算法則擴展閱讀:
計算機中的符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示「正」,用1表示「負」,而數值位,三種表示方法各不相同。
在計算機系統中,數值一律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。
㈣ 二進制數反碼和補碼的演算法
計算機里的二進制數有八位、十六位等,下面以八位為例
19的二進制數為:0001
0011
那麼+19
原碼為
0001
0011
反碼為
0001
0011
補碼為
0001
0011
那麼-19
原碼為
1001
0011
(左邊第一位表示正負數,正數為0,負數為1)
反碼為
1110
1100
補碼為
1110
1101
㈤ 補碼運算規則是什麼
對於正數,原碼反碼補碼都是一樣的,對於負數,不看符號位對於剩下求反。
就是把0變成1把1變成0,就是求反了,求反後+1再添上符號位.就得到了補碼,注意這里符號位是不參與取反與+1的10000001
首位(符號位)是1,這個數位負數。
取反:11111110加1
11111111結果為-127
(5)73二進制補碼運演算法則擴展閱讀:
正數
正整數的補碼是其二進製表示,與原碼相同。
例:+9的補碼是00001001。(備註:這個+9的補碼是用8位2進制來表示的,補碼表示方式很多,還有16位二進制補碼表示形式,以及32位二進制補碼表示形式,64位進制補碼表示形式等。每一種補碼表示形式都只能表示有限的數字。)
㈥ 87+(-73)表示成二進制補碼,然後按補碼進行運算,麻煩幫我這下過程,看看結果是否溢出
若字長8位,則:
[-73]原 =11001001b
[-73]反 =10110110b
.
[-73]補 =10110111b
[87]補 =01010111b (+
------------------------------
[87-73]補=00001110b 最高位(符號位)進位自然丟失
結果 87+(-73) =+1110b =+14d
Cs⊕Cp = 1⊕1 = 0 無溢出,
(Cs是符號位的進位,Cp是最高數值位的進位,⊕表示異或)
㈦ 二進制補碼怎麼算
數值在計算機中表示形式為機器數,計算機只能識別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等其他高級語言中使用的都是原碼。看了上面這些大家應該對原碼、反碼、補碼有了新的認識了吧!
㈧ 如何理解二進制原碼,反碼,補碼,二進制補碼運算
帶符號數,有三種表示方法,即:原碼、反碼和補碼。
但是,在計算機系統中,數值一律用【補碼】來表示和存儲。
所以,在計算機系統中,原碼和反碼,都是不存在的。
使用補碼的意義:可以把減法或負數,轉換為加法運算。
因此,就能簡化計算機的硬體。
=====================
補碼的概念,來自於:補數。
比如鍾表,時針轉一圈,周期是 12 小時。
那麼,倒撥 3 小時,可以用正撥 9 小時代替。
9,就是-3 的補數。計算方法:9 = 12-3。
同理,分針倒撥 X 分,可以用正撥(60-X)代替。
60,是分針的周期。
懂得三角函數的同學,都知道,三角函數的周期是 2π。
那麼,在-π/2 和 +3π/2 處的函數值是相同的,可互換。
演算法是:+3π/2 =2π - π/2。
------------
當你使用兩位十進制數:0~99,周期就是 一百。
那麼,減一,就可以用 +99 代替。
24-1 = 23
24 + 99 = (1) 23
舍棄進位,這兩種演算法,功能就是相同的。
於是,99 就是 -1 的補數。
計算:補數 = 周期 + 負數
對於其它負數,自己去求補數吧。
------------
計算機中使用二進制,補數,就改稱為【補碼】。
八位二進制是:0000 0000~1111 1111。
相當於十進制:0~255,周期就是 256。
那麼,-1,就可以用 255 = 1111 1111 代替。
所以:-1 的補碼,就是 1111 1111 = 255。
同理:-2 的補碼,就是 1111 1110 = 254。
繼續:-3 的補碼,就是 1111 1101 = 253。
。。。
最後:-128 的補碼,就是 1000 0000 = 128。
負數補碼的計算公式:【 256 + 這個負數 】。
(式中的 256 = 2^8,是八位二進制的周期。)
正數,並不存在補碼的問題。
所以,正數,並沒有補碼,可以直接運算。
(也有人亂說:正數本身就是補碼。)
------------
求解算式:7-3 = 4。
計算機中,並沒有減法器,必須改用補碼相加。
列豎式如下:
7 的補碼=0000 0111
-3的補碼=1111 1101
--相加-------------
得:(1)0000 0100= 4 的補碼
舍棄進位,只保留八位,結果完全正確。
------------
藉助於補碼,可以簡化計算機的硬體。
原碼和反碼,都沒有這種功能。
所以,在計算機中,根本就沒有原碼和反碼。
它們都是什麼?就不用關心了。
㈨ 二進制補碼運演算法則是什麼
正數的補碼=原碼
負數的補碼={原碼符號位不變}+{數值位按位取反後+1} or
= {原碼符號位不變}+{數值位從右邊數第一個1及其右邊的0保持不變,左邊安位取反}
以十進制整數+97和-97為例:
+97原碼=0110_0001b
+97補碼=0110_0001b
-97原碼=1110_0001b
-97補碼=1001_1111b
(9)73二進制補碼運演算法則擴展閱讀
意義
1、解決了符號的表示的問題;
2、可以將減法運算轉化為補碼的加法運算來實現,克服了原碼加減法運算繁雜的弊端,可有效簡化運算器的設計;
3、在計算機中,利用電子器件的特點實現補碼和真值、原碼之間的相互轉換,非常容易;
4、補碼表示統一了符號位和數值位,使得符號位可以和數值位一起直接參與運算,這也為後面設計乘法器除法器等運算器件提供了極大的方便。
㈩ 二進制補碼運算溢出判斷
補碼運算的溢出判別方式為雙高位判別法,利用Cs表示符號位是否進位,利用Cp表示最高數值位是否進位。如果Cs ^ Cp的結果為真,則代表發生了溢出(運算結果大於0則為負溢出,小於0則為正溢出),否則運算結果正確。
例如:
1000 0011(補碼為-3,原碼為-125) 0000 0011(補碼為3,原碼為3)
+1100 1001(補碼為-73,原碼為-55) +1100 1001(補碼為-73,原碼為-55)
10100 1100(補碼為76,原碼為76) 01100 1100(補碼為-76,原碼為-52)
Cs為1,Cp為0所以產生了負溢出。 Cs為0,Cp為0所以結果正確。
(10)73二進制補碼運演算法則擴展閱讀
二進制補碼運算規則:
1、正數:原碼=反碼=補碼
2、負數:原碼(第一位是1符號位)=反碼(除第一位符號位外,其它按位取反)=補碼(反碼+1)
3、0:原碼=反碼=補碼=0
舉例:
1、15-5=15+(-5)=10
原碼:
15:0000 1111
-5:1000 0101
反碼:
15:0000 1111
-5:1111 1010
補碼:
15:0000 1111
-5:1111 1011