计算机内部使用补码进行计算的根本原因(个人理解)

根本原因:计算机中使用原码计算会出错是因为将机器码当作二进制进行了计算,即想当然地认为:
a + b = [ a ] 原 + [ b ] 原 a + b = [a]_原 + [b]_原 a+b=[a]+[b]
但是,如果机器中用原码表示数字,则其规律不符合二进制的计算规则。

简单解释一下,以8位二进制为例:

如果使用原码,如下表

机器码代表的真值
正数0000 0000 ~ 0111 1111+0 ~ 127
负数1000 0000 ~ 1111 1111-0 ~ -127

表示范围为 -127 ~ 127,且有两个零值。

如果使用补码,如下表

机器码代表的真值
正数0000 0000 ~ 0111 1111+0 ~ 127
负数1000 0000 ~ 1111 1111-128 ~ -1

表示范围为 -128 ~ 127,不存在两个零值的问题。

8位二进制的计数规律可以表示为如下循环:
在这里插入图片描述
按照箭头方向,由二进制加法可以互相转换,也就是说,要将机器码按照二进制数计算规则进行计算,其表示方法必须符合这个循环。

我们回过头来看原码和补码的表示:
补码:真值的计数方向与二进制计数方向一致
补码
原码:真值的计数方向与二进制计数方向不一致
在这里插入图片描述
有了正确的计数循环之后,就可以使用机器码进行计算了,此外,这个循环还可以解释为什么有:
[ a ] 补 − [ b ] 补 = [ a ] 补 + [ − b ] 补 [a]_补 - [b]_补 = [a]_补 + [-b]_补 [a][b]=[a]+[b]
将循环中的箭头方向理解成加减(图中顺时针为加,逆时针则为减),所加/减的数即为该数的补码在循环中按顺时针与 [ 0 ] 补 [0]_补 [0]的距离。例如:
0 − 1 = [ 0 ] 补 − [ 1 ] 补 = [ 0 ] 补 + [ − 1 ] 补 0 - 1 =[0]_补 - [1]_补 = [0]_补 + [-1]_补 01=[0][1]=[0]+[1]

如下图所示,减1是逆时针1到0的“距离”,加(-1)是顺时针(-1)到0的“距离”,所得结果相同,所以上式成立。
在这里插入图片描述
以上纯属个人理解,如有错误,欢迎指正。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值