现在的位置: 首页 > 综合 > 正文

补码原理

2018年05月07日 ⁄ 综合 ⁄ 共 2210字 ⁄ 字号 评论关闭

原帖地址:http://www.verycd.com/groups/PPMM1999/658155.topic

------------------------------------------------------------------------------------------------

(下表由于格式问题,应该是一列一列对应才对)
一 二 三 四 五 六
十进制值 二进制原码 补码 十进制值 二进制原码 补码
1 0001 0001 -1 1001 1111
2 0010 0010 -2 1010 1110
3 0011 0011 -3 1011 1101
4 0100 0100 -4 1100 1100
5 0101 0101 -5 1101 1011
6 0110 0110 -6 1110 1010
7 0111 0111 -7 1111 1001
0 0000 0000 -8 1000 1000

序言:在计算机里,为了区别正负数,采用第一位表示符号(正或负),这样一来,在计算机的二进制里做加法没问题,但既有加法又有减法时问题就来了:如做1 - 1 =0 时

(0 001)原 + (1 001)原 = (1 010)原 = ( -2 ) 显然不正确(原因是第一位是用来表示正或负号)。

为了解决这个问题,人们想出了补码的概念,亦即补码的设计目的是:

⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.

⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计

以下介绍我对于补码的一些理解。

十进制中减一等于加上负一,我们知道时钟(时钟为十二进制)里“十点”减“三点”等于“七点”,而我们也知道“十点”加上“九点”也等于“七点”。利用这个原理,我们称在时钟的十二进制中,“三点”的补码为“九点”(因为减三和加九等价,不记天数的增加)。

四位二进制里(以四位为例比较简单介绍),我们知道“0001”加上“1111”等于“10000”,但“10000”超过了四位,故称其为溢出,并把最高位“1”舍去。举例子:如果“0010”减“0001”,则等于“0001”,而我们也知道“0010”加“1111”也等于“0001”,这样我们就在二进制里实现减法向加法的转换。而二进制里的第一位是符号位(0表示正数,1表示负数),故数值即如表中“二”和“五”所示。通过上面补码的一些规则我们知道减一(或加负一)等于加上一的补码,这就需要寻找“五”(负数列)与“六”产生一一对应关系的规则才能找出有符号位的二进制减法向加法的转换规则,根据观察上表(或者说是试探吧)可知“五”和“六”的第一位都是一,只是后面三位有所不同,所以在保持第一位都是一的前提下对“五”的后三位进行“特殊”处理(按位取反然后再在末位加一,如“001”取反变成“110”,再加一变成“111”)即得到“六”的后三位,这就是“五”和“六”的一 一对应关系规则。

综合二进制正数和负数的这些规律我们得出下面这个二进制数的加减法均化为加法计算的规律(也称补码运算):正数的补码为其本身(因其可以直接加),负数的补码为符号位保持“一”不变,后面的位取反然后再加一(即上面所说的“特殊”处理),作加减法时的公式为

“补码”+“补码”=“得数的补码”

,如4+(-3)=1的二进制计算是“0100”(4原码为“0100”)+“1101”(-3原码为“1011”)=“0001”(0001的补码就是它本身,因0001是正数)。对于更多位的二进制运算也适用与此规律。取反加一是因为两个四位二进制数相加等于“10000”时(即互为补数),已知其中一个数求其补码:其中一个数就等于“10000”减去另外一个数,由于机器的原因限制了位长只能为四位,故采用“10000”先减去一变成“1111”,再减去其中一个数,这样的话在直观上看来就是被减的数“取反”(即0变1,1变0);因为之前减去了一,所以减了之后再加回一,这样实现了“补数”之间的转换,这就是取反加一的原因。

特别地,0的二进制表示是“0000”,其补码也就是它本身;- 8的二进制表示是“1000”,其补码也是它本身,这是因为- 8(“1000”)的后三位取反后是“111”,再加一是“1000”,因为这是后三位,且- 8的符号位不能变,所以- 8的后三位加一后(即“1000”)的最高位 “一”溢出舍去,故- 8的补码还是它本身。以上就是二进制正负数的加减法的补码原理解析。有任何理解不恰当之处恳请指出,不胜感激。

探讨可不可以用0表示负数的符号位,用1表示正数的符号位?

答:可以!
如果0表示负数符号位,1表示正数符号位,则有下表:
(下表由于格式问题,应该是一列一列对应才对)

一 二 三 四 五 六
十进制值 二进制原码 补码 十进制值 二进制原码 补码
1 1001 1111 -1 0001 0001
2 1010 1110 -2 0010 0010
3 1011 1101 -3 0011 0011
4 1100 1100 -4 0100 0100
5 1101 1011 -5 0101 0101
6 1110 1010 -6 0110 0110
7 1111 1001 -7 0111 0111
8 1000 1000 0 0000 0000

这时补码要反之而行,也就是正数补码为最高位不变后三位取反加一,负数的补码为其本身。但计算公式还是不变,也就是,作加减法时的公式也为:

“补码”+“补码”=“得数的补码”

,如4+(-3)=1的二进制计算是“1100”(4原码为“1100”,巧合~)+“0011”(-3原码为“0011”)=“1111”(1001的补码是1111,因其为正数).


抱歉!评论已关闭.