为什么要使用原码,反码,补码
为什么要使用原码,反码,补码?
实际上,计算机根本就不使用原码和反码!
在计算机系统中,数值,一律采用补码表示和存储。
原码和反码呢?
计算机从来就没有用过它们。
.
在计算机中,以八个二进制位,作为一个字节。
. 数字 0,存放的补码,就是 0000 0000。
正数,依次递增,即可:
. 数字 +1,其补码就是 0000 0001。
. 数字 +2,其补码就是 0000 0010。
. 。。。
负数,就是依次递减:
. 数字-1,就是 0000 0000-1 = 1111 1111。
. 数字-2,就是 1111 1111-1 = 1111 1110。
. 。。。
归纳:
. 正数的补码,就是:0 + 该正数 = 该正数。
. 负数的补码,就是:0 + 该负数。
比如:
. +9 的补码是:0000 1001。
. -9 的补码是:0000 0000-0000 1001=1111 0111。
你看吧,求补码的计算过程,也用不着原码和反码。
.
有了补码,就可以用加法,完成减法运算了。
比如: (+2)-(+1) = +1。
计算机的计算如下:
. 0000 0010 + 1111 1111= 0000 0001。
借助于补码,负数和减法,都可以转化成加法来进行运算。
那么,计算机的硬件,就可以简化了。
因此,在计算机中,只有加法器,并没有减法器。
------------------------
补码是怎么回事? 这得从“补数”谈起。
计算机所能计算的位数,是固定的,如八位机、16 位。。。
位数限定之后,就可以用“补数”代替负数,用加法实现减法运算。
如限定两位十进制,-1,就可以用 +99 代替。
25 - 1 = 24
25 + 99 = (一百) 24
舍弃进位,只取两位,这两种算法功能就完全相同。
99,就是-1 的补数。 计算公式:补数 = 一百+负数。
一百,是两位十进制数的计数周期。
-------------------------
计算机用二进制,补数,就改称为:补码。
八位二进制:0000 0000 ~ 1111 1111 (十进制 255)。
计数周期是:2^8 = 256。
求负数补码的计算公式,也是: 周期 + 负数。
-1 补码就是:256 + (-1) = 255 = 1111 1111(二进制)。
用不存在的“原码反码取反加一”来求,也是这个结果。
正数,不用转换,直接参加运算。所以,正数自身就是补码。
-------------------------
举例说明,如: 5 - 7 = -2。
用补码计算的过程如下:
5 的补码=0000 0101
-7的补码=1111 1001
--相加-------------
得 (1) 1111 1110 = -2 的补码
舍弃进位,只保留八位,这就用加法,实现了 5-7。
推荐于2017-11-23
有了数值的表示方法就可以对数进行算术运算,但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下:假设字长为8bits
(1) 10 - (1)10 = (1)10 + (-1)10 = (0)10
(0 0000001)原 + (1 0000001)原 = (1 0000010)原 = ( -2 ) 显然不正确。
因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上。对除符号位外的其余各位逐位取反就产生了反码。反码的取值空间和原码相同且一一对应。下面是反码的减法运算:
(1)10 - (1)10 = (1)10 + (-1)10 = (0)10
(0 0000001)反 + (1 1111110)反 = (1 1111111)反 = ( -0 ) 有问题。
(1)10 - (2)10 = (1)10 + (-2)10 = (-1)10
(0 0000001)反 + (1 1111101)反 = (11111110)反 = (-1) 正确。
问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的。(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大)。
于是就引入了补码概念。负数的补码就是对反码加一,而正数的补码不变,正数的原码反码补码是一样的。在补码中用(-128)代替了(-0),这个是人为规定的,所以补码的表示范围为:
(-128~0~127)共256个。
注意:(-128)没有相对应的原码和反码, (-128) = (1 0000000) 补码的加减运算如下:
(1)10 - (1)10 = (1)10 + (-1)10 = (0)10
(0 0000001)补 + (1 1111111)补 = (0 0000000)补 = ( 0 ) 正确。
(1)10 - (2)10 = (1)10 + (-2)10 = (-1)10
(00000001)补 + (11111110)补 = (11111111)补 = (-1) 正确。
所以补码的设计目的是:
⑴ 使符号位能与有效值部分一起参加运算,从而简化运算规则。补码机器数中的符号位,并不是强加上去的,是数据本身的自然组成部分,可以正常地参与运算。
⑵ 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。
所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、c等其他高级语言中使用的都是原码。