您的位置:首页 > 其它

为什么要用补码表示

2012-01-04 13:46 211 查看
用补码的主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。n位计算机,设n=8,所能表示的最大数是11111111,若再加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的模为2(8)。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码[1]。
最直观的得到一个负数的补码的方法是用28去减它,例如:
-1的补码100000000

-)00000001

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

=11111111(实际上就是1+(11111111–1),先计算括号内,相当于按位取反,然后再加上外面的1。


首先说说无符号数的表示,一个字节可以表示28-1=256个数,00000000~11111111分别表示0~255。这个很简单。
对于无符号数,一个字节同样只能表示256个数,那么怎么表示负数,一个比较好的办法就是将字节的最高位表示为符号位,其余7位表示数值,表示范围为-128~127,00000000~01111111表示0~127,10000001~11111111表示-1~-127吗,错!,实际上是10000000~11111111分别对应表示-128~-1,怎么会是这样呢,是不是搞错了,没错的,这就是补码,负数在计算中是以补码来表示的。
那么补码是怎么得到的呢?为了说明这个问题,让我们来先了解一下什么是原码和反码的概念。
原码:数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了,原码表示范围为-127~-0,+0~+127,除了最高位表示符号位,正负数在其余各位的表示是相同的,例如10000001表示-1,11111111表示-127。原码表示虽然很简单,但人们很快就发现用原码来进行加减运算会出问题:假设字长为8bits[2]
(1)10-(1)10=(1)10+(-1)10=(
0)10
(00000001)原+(10000001)原=(10000010)原=(-2)显然不正确
因为两个整数的相加没有问题,所以问题出在带符号位的负数上,人们将负数除符号位的其它位逐位取反,就得到了反码。
(1)10-(2)10=(1)10+(-2
)10=(-1)10
(00000001)反+(11111101)反=(11111110)反=(-1)正确
发现反码表示后,将加减数都表示成反码后,减法可以直接表示成加法,其结果似乎是正确的。但是:
(1)10-(1)10=(1)10+(-1)10=(
0)10
(00000001)反+(11111110)反=(11111111)反=(-0)有问题.
问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的,于是就出现了补码,正数的补码不变,负数的补码是将其反码加1,这样表示后再看看上面的运算:
(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)正确

P.S.

一的补码(one'scomplement)指的是正数=原码,负数=反码

而二的补码(two'scomplement)指的就是通常所指的补码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: