言简意赅剖析计算机使用补码的意义

计算机中为何直接用数字的二进制原码进行计算,而是用原码的补码形式进行计算呢?


让我们来先看一个例子:

想象一个机械时钟,现在时针对应3点,顺时针拨一格(3+1)就是4点,逆时针拨一格(3-1)就是2点。如果时钟不支持逆时针运动,那么要到2点位置,我们可以顺时针旋转12-1=11格,这里如果可以称12为周期,1与11暂且定义为互为补数。所以减去一个数等于加上这个数的补数。


signed和unsigned数的表示方法:

如果我们用一个字节(8bit)来表示一个数。

如果这个数是非负数,那么很简单,从0000 0000~1111 1111 即0~255 能表示这256个数字完全没有问题。

如果我们要表示一个负数,计算机科学家已经想到用这个字节的最高位作为符号位,0表示正数,1表示负数,剩下的7bit低位用来表示数字的绝对值。我们粗略可以想到从1111 1111~0111 1111 即 -127~127,这没有问题。但是中间出现了1000 0000(-0)和0000 0000(+0)表示的本质都是0。造成了非唯一性和浪费。所以计算机科学家人为规定用1000 0000来表示-128。这样一个字节表示有符号数字的范围是-128~127,刚好256个。


我们继续分析


在计算机中,如果两个正数相加,计算机的加法器直接可以完成,但是如果是两个数相减呢?难道我们还要单独去设计减法器?甚至乘法器,除法器吗?在数学中,我们可以把后三种运算转化为加法运算。所以在计算机中我们也可以用同样的原理。

例如:3-1 = 3+(-1)=2

3的二进制  0000 0011

-1的二进制1000 0001

如果直接做加运算结果为1000 0100(-4)显然计算结果不对。

2的二进制0000 0010

如果我们这样计算:

0000 0011(3)

+ 1111  1111

= 0000 0010(2)

这里如果我们用1111  1111来代替上面的1000 0001(-1)来做加法计算能得到正确的结果,并且最高位的符号位不用区分对待,直接参与计算。

所以人们觉得在计算机运算中用二进制1111  1111来表示(-1)直接做上述计算非常简单。

那么到底1000 0001和1111  1111又有什么关系呢?他们怎么转化呢?

1000 0001的最高位不变,低7位求反1111 1110 然后再加0000 0001就等于1111  1111。这种运算被人们命名为求反码运算。所以反码的存在就是在这种需求中出现的。


回到最开始的例子,抛开符号位不管:

3-1=0000 0011 - 0000 0001=0000 0011 + 1111 1111=0000 0010(2)

所以这里0000 0001(1)与1111 1111(127)对于周期128来说是补数的关系。其实原理读者想必已经明白了其中内部的机制了吧,其实就是利用溢出的原理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值