在二进制数中,为什么会有原码、反码、补码

由于二进制只有0和1两种数,因此在计算机中搭建运算电路时比十进制运算电路简单很多。

1、原码

  在n为字长的原码系统中,最左侧表示符号位,在计算机中,我们人为定义二级制负数最左侧为‘1’表示负值,二进制正数最左侧为‘0’表示正数。这样的n位字长源码系统能表示的数值范围为(-(2n-1 -1)~(2n-1 -1))

  例如,-310=10112   ,+610=01102  .;

  虽然此时计算机即可以表示正数也可以表示负数。但是带来了一个问题,让我们进行个简单的加法运算看看。

  610+(-310)=0110+10112 =(1)0001=1710 

  610 +310 =01102 +0011=10012 =(-110);

  计算错误,故原码不能直接做运算。为了解决此问题,就有了反码(1’s complement)和补码(2’s complement)。

2、补码

  在补码系统中,一个n位字长的正整数N的补码为本身且最左侧为0,但是一个n位字长负数-N的补码为N且有如下定义:

  N* =2-N

  例如,当-N=-510 =11012 ,它的补码N*等于对应正数N=510 参与下列运算,N* =100002-01012 =10112

   另一种计算n位字长负数补码的方法为最左侧符号位不变,其余位取反,然后最右侧加1。

  例如,-N=-510 =11012 ,N* =1011

 

 2.1补码的加法

  n位带符号的的二进制数的加法运算在补码系统中可以直接计算。加法中的运算过程就像所有数是正数一样,并且符号位产生的进位都需要忽略。以下n=4时不同情况出现的结果。

  1、两个正数相加,和小于2-1。

  310+410 =00112+01002 =01112 =710;(结果正确)

  2、两个正数相加,和大于2-1。

510+610=01012+01102 =1011=1110 >23;(结果错误)

  两个n位带符号数进行运算时,结果范围为(-(2n-1 -1)~(2n-1 -1)),大于此结果,称为溢出。

  3、正数与负数相加,负数的绝对值较大。

510+(-610)=01012+10102=11112 =-110 <23;(结果正确)

  4、与第三种情况相同,只是正数绝对值比负数大。

-510+610=10112+01102=(1)00012 <23;(符号位产生的进位忽略,没有溢出,结果正确)

  5、两个负数相加,和的绝对值小于2n-1

  -32+(-42)=11012+11002=(1)10012=-710 ;(忽略符号位的进位,没有溢出,结果正确)

  6、两个负数相加,和的绝对值大于2n-1

-510+(-610)=10112+10102=(1)01012 =-1110 <-23;(结果溢出,结果错误,-11带符号为共需5位才能表示)

3、反码

  反码与补码加法类似,只是最后产生的进位不是丢弃而是再次加到n位和的最右位上,这被称为循环进位(end-around carry)。正数反码加法和前面补码示例中前两点相同。下面给出其余的反码加法情况(n=4)。

  3、正数与负数相加,负数绝对值较大。

510+(-610)=01012+10012=11102=-110 ;(结果正确)

  4、与(3)相同,只是正数比负数绝对值大。

-510+610=10102+01102=(1)00002;

00002+00012=00012 =110(循环进位,没有溢出,结果正确)

  5、两个负数相加,结果的绝对值小于2n-1

-310+(-410)=11002+10112=(1)01112 ;

01112+00012=10002 =-710;(循环进位,没有溢出,结果正确)

  6、两个负数相加,结果的绝对值大于2n-1

-510+(-610)=10102+10012=(1)01112;

01112+00012=10002 =-710;(结果溢出,结果错误)

  值得注意,两个负数相加结果为正,因此也能检测出错误。

猜你喜欢

转载自www.cnblogs.com/Maxwill-Peng/p/11007093.html