二進位制的減法運演算法則是:
0-0=1-1=0
1-0=1
0-1=1(向高位借位)
例如,(11000011)2-(00101101)2的算式如下:
11000011 被減數
00101101 減數
---1111 借位 (減號是對齊美觀用的)
-------------------
10010110 差數
這個借位其實很容易理解的,向前一位借一,計算到該位時再減去一即可.
比如被減數0,減數1,演算法應該是0-1=1(向高位借一)但是該被減數被後面的借了一位,那麼現在的算式應該是0-1-1=0(減掉被借的1,再向高一位借1)以此迴圈至到沒有可借的為止.
二進位制的加法運演算法則是:
0+0=0
0+1=1+0=1
1+1=0(向高位進位)
例如,(110)2+(1011)2的算式如下:
+110 被加數 (加號是對齊美觀用的)
1011 加數
111 進位
----------------
10001 和數
二進位制的乘法運演算法則是:
0*0=0
0*1=1*0=0
1*1=1
二進位制的乘法可以歸結為"復位+移位"操作.移位像加法運算那樣
二進位制的除法運演算法則是:
0/1=0(1/0無意義)
1/1=1
在計算機內部,二進位制數的加法是基本運算,利用加法可以實現二進位制數的減法、乘法和除法運算。其原理主要是應用了“補碼”運算
二進位制補碼
數值在計算機中表示形式為機器數,計算機只能識別0和1,使用的是二進位制,而在日常生活中人們使用的是十進位制,"正如亞里士多德早就指出的那樣,今天十進位制的廣泛採用,只不過我們絕大多數人生來具有10個手指頭這個解剖學事實的結果.儘管在歷史上手指計數(5,10進位制)的實踐要比二或三進位制計數出現的晚."(摘自>有空大家可以看看哦~,很有意思的).為了能方便的與二進位制轉換,就使用了十六進位制(2 4)和八進位制
1.數值有正負之分,計算機就用一個數的最高位存放符號(0為正,1為負).這就是機器數的原碼了.假設機器能處理的位數為8.即字長為1byte,原碼能表示數值的範圍為
(-127~-0 +0~127)共256個.
I.有了數值的表示方法就可以對數進行算術運算.但是很快就發現用帶符號位的原碼進行乘除運算時結果正確,而在加減運算的時候就出現了問題,如下: 假設字長為8bits
( 1 )?10-? ( 1 )10?=? ( 1 )10?+ ( -1 )10?= ?( 0 )10
(00000001)原?+ (10000001)原?= (10000010)原?= ( -2 )?顯然不正確.
II.因為在兩個整數的加法運算中是沒有問題的,於是就發現問題出現在帶符號位的負數身上,對除符號位外的其餘各位逐位取反就產生了反碼.反碼的取值空間和原碼相同且一一對應. 下面是反碼的減法運算:
?( 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等其他高階語言中使用的都是原碼。看了上面這些大家應該對原碼、反碼、補碼有了新的認識了吧!
二進位制的減法運演算法則是:
0-0=1-1=0
1-0=1
0-1=1(向高位借位)
例如,(11000011)2-(00101101)2的算式如下:
11000011 被減數
00101101 減數
---1111 借位 (減號是對齊美觀用的)
-------------------
10010110 差數
這個借位其實很容易理解的,向前一位借一,計算到該位時再減去一即可.
比如被減數0,減數1,演算法應該是0-1=1(向高位借一)但是該被減數被後面的借了一位,那麼現在的算式應該是0-1-1=0(減掉被借的1,再向高一位借1)以此迴圈至到沒有可借的為止.
二進位制的加法運演算法則是:
0+0=0
0+1=1+0=1
1+1=0(向高位進位)
例如,(110)2+(1011)2的算式如下:
+110 被加數 (加號是對齊美觀用的)
1011 加數
111 進位
----------------
10001 和數
二進位制的乘法運演算法則是:
0*0=0
0*1=1*0=0
1*1=1
二進位制的乘法可以歸結為"復位+移位"操作.移位像加法運算那樣
二進位制的除法運演算法則是:
0/1=0(1/0無意義)
1/1=1
在計算機內部,二進位制數的加法是基本運算,利用加法可以實現二進位制數的減法、乘法和除法運算。其原理主要是應用了“補碼”運算
二進位制補碼
數值在計算機中表示形式為機器數,計算機只能識別0和1,使用的是二進位制,而在日常生活中人們使用的是十進位制,"正如亞里士多德早就指出的那樣,今天十進位制的廣泛採用,只不過我們絕大多數人生來具有10個手指頭這個解剖學事實的結果.儘管在歷史上手指計數(5,10進位制)的實踐要比二或三進位制計數出現的晚."(摘自>有空大家可以看看哦~,很有意思的).為了能方便的與二進位制轉換,就使用了十六進位制(2 4)和八進位制
1.數值有正負之分,計算機就用一個數的最高位存放符號(0為正,1為負).這就是機器數的原碼了.假設機器能處理的位數為8.即字長為1byte,原碼能表示數值的範圍為
(-127~-0 +0~127)共256個.
I.有了數值的表示方法就可以對數進行算術運算.但是很快就發現用帶符號位的原碼進行乘除運算時結果正確,而在加減運算的時候就出現了問題,如下: 假設字長為8bits
( 1 )?10-? ( 1 )10?=? ( 1 )10?+ ( -1 )10?= ?( 0 )10
(00000001)原?+ (10000001)原?= (10000010)原?= ( -2 )?顯然不正確.
II.因為在兩個整數的加法運算中是沒有問題的,於是就發現問題出現在帶符號位的負數身上,對除符號位外的其餘各位逐位取反就產生了反碼.反碼的取值空間和原碼相同且一一對應. 下面是反碼的減法運算:
?( 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等其他高階語言中使用的都是原碼。看了上面這些大家應該對原碼、反碼、補碼有了新的認識了吧!