补码运算规则

  • 格式:doc
  • 大小:43.00 KB
  • 文档页数:6

补码(two's complement)在计算机系统中,数值一律用补码来表示和存储。

原因在于,使用补码,可以将符号位和数值位统一处理;同时,加法和减法也可以统一处理。

此外,补码与原码的的相互转换,其运算过程是相同的,不需要额外的硬件电路。

补码的特性1、一个整数(或原码)与其补数(或补码)相加,和为模。

2、对一个整数的补码再求补码,等于该整数自身。

3、补码的正零与负零表示方法相同。

机器数:计算机中参与运算的数被称为机器数,有以下特点,1、计算机中参与运算的数均为二进制数,这是因为,运算电路是由只能识别“0”、“1”的数字电路组成。

2、机器数有带符号数和无符号数两种。

3、带符号的机器数有源码、反码和补码三种表示方式;无符号数没有源码、反码、补码的区别。

4、CPU的运算电路是按补码的运算规律设计,因此,进行运算的带符号数均用补码表示。

无符号数的运算1、与手工二进制运算的方法相同(指运算电路)。

2、可以用十六进制数的运算代替二进制数的运算,计算时不容易出错,而且快捷。

源码表示法(带符号数)1、正数。

最高位是符号位,用“0”表示正号,即15~0位的第15位为0,7~0位的第7位为0。

2、负数。

最高位是符号位,用“1”表示负号,即15~0位的第15位为1,7~0位的第7位为1。

3、求源码的方法:先将真值转换成二进制数,再写成固定的8位或16位,最高位用“0”或“1”表示数的正号和负号。

计算机就是用这种方法表示。

真值就是带符号的十进制数(补码的绝对值),如+20、-20、+120、-120。

在计算机内,如果是一个二进制数,其最左边的位是1,则我们可以判定它为负数,并且是用补码表示。

若要得到一个负二进制补码的真值(原来的数值),只要对其求补码,就可得到真值。

【例5】-65的补码是10111111若直接将10111111转换成十进制,发现结果并不是-65,而是191。

各位取反(除符号位):11000000,再+1:11000001(-65)反码表示法(带符号数)1、正数。

源码等于反码。

2、负数。

源码的最高位“1”不变,数值部分“1”变“0”,“0”变“1”。

3、求反码的方法:正数不用求反码,正数的源码就是反码。

负数的反码是以负数的源码再求反码。

补码表示法(带符号数)1、正数。

源码等于补码。

2、负数。

反码的最高位“1”不变,数值部分+1。

求补码的方法。

正数的源码等于补码。

负数的补码是以该负数的源码求反码然后再+1获得。

同一个数字在不同的补码表示形式中是不同的。

比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。

以下都使用8位2进制来表示。

【例】求-5的补码。

因为给定数是负数,则符号位为“1”。

后七位:-5的原码(10000101)→符号位不变(10000101)→数值位取反(11111010)→加1(11111011)所以-5的补码是11111011。

【例】数0的补码表示是唯一的。

[+0]补=[+0]反=[+0]原=00000000[ -0]补=11111111+1=00000000补码转化为原码已知一个数的补码,求原码的操作其实就是对该补码再求补码:⑴如果补码的符号位为“0”,表示是一个正数,其原码就是补码。

⑵如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。

【例】已知一个补码为11111001,则原码是10000111(-7)。

因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。

其余七位1111001取反后为0000110;再加1,所以是10000111。

补码的运算(带符号数)补码的运算原理:计算机中的CPU仅有加法电路,没有减法电路。

采用补码运算的目的,是将减法变为加法。

同时,补码运算将符号位视为数共同参与运算,其结果仍然不会出错。

但是,补码运算的条件是运算器有固定的容量,即“模”。

“模”是指一个计量系统的计数范围。

如时钟等。

计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。

表示n位的计算机计量范围是0~2^n-1,模=2^n(2^n表示将2的n次方)。

例如,两位十进制计数器,它的计数容量是00~99,模=100时钟的计数容量是0~11,模=12“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。

任何有模的计量器,均可化减法为加法运算。

例如:假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨4小时,即:10-4=6;另一种是顺拨8小时:10+8=12+6=6在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。

对“模”而言,8和4互为补数。

实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。

共同的特点是两者相加等于模。

对于计算机,其概念和方法完全一样。

n位计算机,设n=8,所能表示的最大数是11111111,若再加1成为100000000(9位),但因只有8位,最高位1自然丢失。

又回了00000000,所以8位二进制系统的模为2^8。

在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。

把补数用到计算机对数的处理上,就是补码。

另外两个概念:一的补码(one's complement) 指的是正数=原码,负数=反码二的补码(two's complement) 指的就是通常所指的补码。

1、补码的加法。

两个补码相加,算法与二进制加法相同,也可以用十六进制数相加。

注意:和仍然是一个补码,符合补码定义。

[X+Y]补= [X]补+ [Y]补【例6】X=+0110011, Y=-0101001,求[X+Y]补[X]补=00110011 [Y]补=11010111[X+Y]补= [X]补+ [Y]补= 00110011+11010111=00001010注:因为计算机中运算器的位长是固定的(定长运算),上述运算中产生的最高位进位将丢掉,所以结果不是100001010,而是00001010,。

2、验算结果。

由补码求真值的方法:先求出补码对应的源码,再求出真值。

对X的补码再进行求补码运算,就得到X的源码。

从补码求源码的方法:正数不用求源码,源码等于补码。

负数的补码符号位不变,数值部分按位取反,然后再+1,得到源码。

注意:由真值求补码或由补码求真值的方法,都必须用二进制数表示才能进行。

补码的减法。

计算机不能做减法,采用的方法是对减数进行进行变补,再与被减数相加实现的。

变补运算的方法:连同符号位一同取反+1。

[X-Y]补= [X]补- [Y]补= [X]补+ [-Y]补【1】【1】在上一个版本中有如下说明:“其中[-Y]补称为负补,求负补的方法是:负数的绝对值的原码所有位按位取反;然后整个数加1。

(恢复本来解释。

请路人真正理解并实际验证后再修改。

以免误导大众。

另外,例6不具典型性,新增例7。

)”私以为,不必要提出负补的概念以使问题复杂化,尽管该解法是正确的,但却完全没有必要增加新的运算方法及运算结构。

求[-Y]补,只需,先将符号位取反,求出-Y,再求-Y的补码即可。

尽管这与求负补的方法实际上是一致的,但是却简化了概念,仅仅是对过去概念以及运算结构的复用。

相应的,原例7(现例8)重新作了修改。

【例7】1-1 [十进制]1的原码00000001 转换成补码:00000001-1的原码10000001 转换成补码:111111111+(-1)=000000001+11111111=0000000000000000转换成十进制为00=0所以运算正确。

【例8增】-7-(-10) [十进制]改为加法形式:-7-(-10)=-7+(-(-10))-7的补码:11111001-(-10)的补码:-10的原码为10001010,-(-10)的原码为00001010,-(-10)的补码就是其原码,为00001010-7 - (-10)= -7 + 10 = 311111001+00001010 = 00000011转换成十进制为33、手工算法:直接减。

不论被减数是大于、等于或小于减数,均用被减数减去减数。

当被减数小于减数时,直接向高位借位,结果仍然正确,而且是一个补码。

例:(-64)-(+20)=(-64)+(-20)= -84(+20)-(-64)=(+20)+(+64)= +84带符号数补码的范围1、8位带符号数补码的范围:-128~+127,80H~7FH或0X80~0XFF。

2、16位带符号数补码的范围:-32768~+32767,8000H~7FFFH或0X8000~0X7FFF。

不带符号数补码的范围1、8位不带符号数补码的范围:0~+255,00H~FFH或0X00~0XFF。

2、16位不带符号数补码的范围:0~+65535,0000H~FFFFH或0X0000~0XFFFF。

代数解释在十进制中我们可以把n位二进制体系中的数a表示为:求补码,意味着求:而根据等比数列求和公式:则因为这里k0,k1,k2,k3……不是0就是1,所以1-k0,1-k1,1-k2的运算就是二进制下的取反注:n位二进制,最高位为符号位,因此表示的数值范围-2^(n-1) ——2^(n-1) -1,所以模为2^(n-1)。

上面提到的8位二进制模为2^8是因为最高位非符号位,表示的数值范围为0——2^8-1。

补码总结补码只是一种相对合理的编码方案。

这个方案在负数的机器表示中解决了3个问题:1、数的表示:在数的表示上通过人为的定义来消除编码映射的不唯一性,对转换后的10000000强制认定为-128。

当然对原码和反码也可以做这种强制认定,那为什么原码和反码没有流行起来?2、数的运算:原码和反码没有流行起来,是因为在数的运算上对符号位的处理无法用当时已有的机器物理设计来实现,由于原码和反码在编码时采用了硬性的人工设计,这种设计在数理上无法自动的通过模来实现对符号位的自动处理,符号位必须人工处理,必须对机器加入新的物理部件来专门处理符号位,这加大了机器设计难度,加大的机器成本,不到万不得已,不走这条路。

设计补码时,有意识的引用了模运算在数理上对符号位的自动处理,利用模的自动丢弃实现了符号位的自然处理,仅仅通过编码的改变就可以在不更改机器物理架构的基础上完成的预期的要求,所以补码沿用至今。

3、自身逻辑意义的完整性:补码这个编码方案要解决的是如何在机器中表示负数,其本质意义为用一个正数来表示这个正数对应的负数。

所谓-20的补码是指:如何在机器中用补码形式表示-20。

具体过程是这样的:将20的二进制形式直接写出00010100,然后所有位取反变成11101011,再加1变成了11101100。