补码的实质

大部分教科书上给的补码的定义都比较弱,只说明了补码的作用可以将减法运算改为加法运算,但书上并没有将这个问题论述清楚,本文旨在分析补码的实质,并将这个问题解释清楚。

补码,意思是某一个数字的补码,之所以叫“补码”,那么,它一定是相对于某个数字来补的,那么,它是相对于哪个数来补的呢,答案是相对于计算空间里最大绝对值加1来补的。

1).时钟模型

现在有一个钟表,只有一根时针,钟表标注:1.2.3...11,定义时钟“顺时钟“方向(即时刻增序发展)走1小时为 +1,”逆时钟“方向(时刻减序发展)走1小时为-1。(我们当然能够设计出一只钟表,让其减序地走,在此不纠结于其物理意义。)

下面我们把时针归1,再让时针指向4,我们可以顺时钟方向拨3下,还有另一种操作:逆时钟方向拨9下。

这两个操作时针的动作覆盖了整个钟表,这个覆盖是由两种操作时钟分别走过的轨迹“补”全起来了!这个补就是补码的实质含义。即,一个数和另一个”反向“的数刚好补成整体!

有了这个基础,我们就可以认识到,A + B 不管结果是正是负,我们都可以将运算过程看作是时钟上面的拨来拨去,暂不考虑计算溢出的情况,也即,钟表上的数字足够表示所有的计算结果。设现在钟表最多能表示2的32次方-1个时间;即计算空间M = 2^32;

比如 -100 + 200:

1.时钟顺时钟拨2^32 - 100格;(其实也就是-100的绝对值按位取反再加1,这个不就是负数补码的计算值吗?)

2.再顺时钟方向拨200格

3.现在时钟必定指到了某个地方,这个结果要么是应该读正数,要么应该读负数。因此,我们距离读出结果还有一个重要的步骤。也就引出了正负数表示模型。


2).计算机系统的正负数

对于计算机系统,为了表示负数,必须在这个数字本身占有的位数上有某个标志,以表示它是正或负,也即必须在表示范围上作牺牲。现在的计算机系统,用最高位来表示符号,0表示正数,1表示负数。以32位的计算机来说明。

不考虑浮点数类型,机器的表示范围为-2^31 到 2^31 - 1,至于为什么最小值的绝对值比最大值的绝对值大1是因为最小值的补码刚好就是十六进制数:8000,它正好是-(2^31)的补码。为了得到最小的数字,可以这样操作32位寄存器,让某个寄存器保留最高位为1,将其它31位表示的值最小化,那么,它就能得到一个最大的绝对值,再加上前面的负号,它就能够达到最小。

现在将1)中的时钟模型稍微改动一下以应用。

计算空间为:M = 2^31;(这个值有一定的保留,实质上,计算空间应该可以达到2^31 + 1,也即最小负数的绝对值加1)

,我们选比计算空间小1的数值作为新的计算空间不会导致计算错误,只会导致多有一个计算结果溢出,那就是-2^31,不过这没有关系,这种错误很容易纠正。

如计算:-(2^31 - 1) - 1

10000..0001 + 111...11111 = 00000....0000

这个值原本应该是等于

100000...000,于是我们可以简单地修正,因为是两个负数相加,那么结果一定为负数,所有在得到结果为0时,只需判断是不是两个负数在相加即可,如果是,直接把最高位置为1即可以得到正确的结果。

我们注意到,如果两个正数相加,一定是正数,那么最高位一定还是为0,当然不考虑溢出的情况;如果是两个负数相加,一定还为负数,也不考虑溢出的情况。如果数值相加有进位,如果一个正数和一个负数相加,那么符号位刚好满足进位规则。因为不管正数绝对值和负数绝对值哪个大,只要数值的计算产生了进位,就一定表示符号位改变了,那么可以直接把这个进位与两个数字的符号位的计算结果,进行再计算,一定能够正确地表示符号情况。综上,把符号加入运算刚好就能表示计算结果的正负性。

于是,在时钟模型基础上,再加上能够标注数字的正负情况,于是就很容易地能够读取结果了。

我们把符号位也进行计算,把结果直接加到时钟计算结果的前面即是正确的结果,时钟计算结果有进位则进到符号位上面。

如: 以为12为计算空间时,4 - 8:

    0    4

+   1    4

——————

    1    8

即结果补码为-8


再计算:-4 - 7:

    1    8

+  1    5

——————

  1 1    3

因为计算结果不会超出计算空间,如果补码的的结果超出计算空间,那么,其真实结果一定不会超过计算空间,所以直接舍弃计算空间的整数倍是不影响结果的。即,结果的补码为-3.









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值