计算机中为什么要使用补码来进行数据运算?

原码、反码、补码定义

原码定义:第一位表示符号,其余位表示值。因为第一位是符号位,所以8位二进制数的取值范围就是:[11111111 , 01111111] ,即 [-127 , 127] 。

反码定义:正数的反码是其本身,负数的反码符号位保持不变,其余位取反。

补码定义:正数的补码是其本身,负数的补码是符号位保持不变,其余位取反+1。

为什么有了原码还需要反码?

对于计算机来说,加减是基本的运算(乘和除的本质也是加法),需要设计的尽量简单,计算机辨别符号位会让计算机的设计电路变得很复杂,于是人们想出了让符号位也参与到运算上来。减去一个数,等于加上他的负数。

对于原码来说,能满足正数的加法,但无法满足负数的加法

从上面的原码表中可以看见左边每增加一个二进制单位对应的真数是递减的,而右边每增加一个二进制单位对应的真数是递增的,所以对于原码来说,能满足正数的加法,但无法满足负数的加法 

2+1 = [00000010]原+[00000001]原=[00000011]原 = 3

1+-1=[000000001]原+[10000001]原=[10000010]原=-2

为了满足负数对加法的需求,就必须让负数与他对应的二进制码是同步递增或者同步递减

于是就通过符号位不变,其余位取反来满足这个同步递增或者递减的要求,由于正数本来就满足它本身的加法,所以不需要做任何改变,这就是反码的定义由来。

为什么有了反码还需要补码?

 

从上图的反码表中可以看到在运算不跨过0的时候,正负数的加法已经能满足要求

-2+1=[11111101]反+[00000001]反 = [1111_1110]反 = -1

127+1=[1000_0000]反=-127=128 加法算出来是128,由于128超过最大值,余1,所以取最小值开始的第一位,也就是最小值-127,但是这里有个不合理的地方,就是[1111_1111]和[0000_0000]都表示0,这导致在实际计算中每当跨过0一次,就有一个单位的误差

-1+2=[1111_1110]反+[0000_0010]反=[0000_0000]反=0

要解决这个问题就必须让反码中的[1111_1111]和[0000_0000]合并,

由于[1111_1111]+[0000_0001]=[0000_0000],所以在负数反码的基础上+1就可以解决反码中跨0的误差问题,同时不会对负数与它对应的二进制反码的同步递增产生影响,所以在反码的基础上+1就完美的解决了符号参与预算的问题,这就是补码为什么是在负数反码的基础上+1的由来。
 

原文链接:https://blog.csdn.net/chenchao2017/article/details/79733278

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值