數值有正負之分
,計算機就用乙個數的最高位存放符號
(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等其他高階語言中使用的都是原碼。看了上面這些大家應該對原碼、反碼、補碼有了新的認識了吧!
原碼 反碼 和 補碼。
這裡只講下自己對反碼的理解。大家都知道使用反碼表示負數有兩個優點,1.可以使得減法可以和加法一樣。2.符號位也參與了運算。那這是為什麼呢?下面可以進行一些簡單的數學推導 根據反碼定義,對於負數,反碼是除符號為以外取反 1。例如,4 變換步驟如下。a 4 0 000 0100 b 取反 0 111 1...
原碼 補碼和反碼
1 原碼表示法 原碼表示法是機器數的一種簡單的表示法。其符號位用0表示正號,用 表示負號,數值一般用二進位制形式表示。設有一數為x,則原碼表示可記作 x 原。例如,x1 1010110 x2 一1001010 其原碼記作 x1 原 1010110 原 01010110 x2 原 1001010 原 ...
原碼 反碼和補碼
首先說一下機器數和真值 1 機器數 數在計算機中的二進位制表示形式就稱為機器數。機器數是帶符號的,在計算機用乙個數的最高位存放符號 0為正,1為負 這樣就將數的符號數值化了。比如,十進位制中的數 5 計算機字長為8bits,轉換成二進位制就是00000101。如果是 5 就是 10000101 那麼...