在二进制数中,为什么会有原码反码补码
Posted maxwill-peng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在二进制数中,为什么会有原码反码补码相关的知识,希望对你有一定的参考价值。
由于二进制只有0和1两种数,因此在计算机中搭建运算电路时比十进制运算电路简单很多。
1、原码
在n为字长的原码系统中,最左侧表示符号位,在计算机中,我们人为定义二级制负数最左侧为‘1’表示负值,二进制正数最左侧为‘0’表示正数。这样的n位字长源码系统能表示的数值范围为(-(2n-1 -1)~(2n-1 -1))
例如,-310=10112 ,+610=01102 .;
虽然此时计算机即可以表示正数也可以表示负数。但是带来了一个问题,让我们进行个简单的加法运算看看。
610+(-310)=01102 +10112 =(1)00012 =1710 ;
610 +310 =01102 +00112 =10012 =(-110);
计算错误,故原码不能直接做运算。为了解决此问题,就有了反码(1’s complement)和补码(2’s complement)。
2、补码
在补码系统中,一个n位字长的正整数N的补码为本身且最左侧为0,但是一个n位字长负数-N的补码为N* 且有如下定义:
N* =2n -N
例如,当-N=-510 =11012 ,它的补码N*等于对应正数N=510 参与下列运算,N* =100002-01012 =10112 ;
另一种计算n位字长负数补码的方法为最左侧符号位不变,其余位取反,然后最右侧加1。
例如,-N=-510 =11012 ,N* =10112 ;
2.1补码的加法
n位带符号的的二进制数的加法运算在补码系统中可以直接计算。加法中的运算过程就像所有数是正数一样,并且符号位产生的进位都需要忽略。以下n=4时不同情况出现的结果。
1、两个正数相加,和小于2n -1。
310+410 =00112+01002 =01112 =710;(结果正确)
2、两个正数相加,和大于2n -1。
510+610=01012+01102 =10112 =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;(结果溢出,结果错误)
值得注意,两个负数相加结果为正,因此也能检测出错误。
以上是关于在二进制数中,为什么会有原码反码补码的主要内容,如果未能解决你的问题,请参考以下文章