补码的意义及计算【解决混淆最高位符号位是否参与计算的问题】

指路大佬:二进制的原码、反码、补码 - 知乎 (zhihu.com)


总:在计算机系统中,数据一律用补码表示和存储。主要原因是:使用补码,可以将符号位和数据位统一处理,同时,加法和减法也可以统一处理。除此之外,原码和反码中有+0和-0的存在,补码中只有+0,没有-0。用补码计算简化运算。 补码中不存在-0, 10000000表示-128

补码最重要的意义就是便于计算,加法和减法都可以当作加法来处理。

便于计算首要思想是一对相反数的补码相加是全0。理解这个思想我们方便处理最高位是符号位还是参与数值计算。比如-56+-67=-123,但是-123 结果是10000101,这个最高位是否要参与计算?为什么?理解了相反数的补码相加是0,我们便不会混淆这个问题。


一、第一种解释-负数的补码的求法为什么是反码+1

注意,计算机存储中没有反码,反码的意义就是便于我们计算补码。反码的存在是因为补码的存在。补码的意义并不是反码+1。这只是一种便于我们计算的方式而已。

首先,一对相反数的反码相加是全1【全1为个人便于理解的表述,非书本表述】。

举例:

+8原码:00001000   +8的反码和原码相同

 -8原码:10001000  

 -8反码:11110111

+8和-8的反码相加为 

00001000+11110111=11111111 即全1。

因此,两个相反数的补码相加是全0【全1为个人便于理解的表述,非书本表述】。

具体推导:

我们通常所学习的负数的补码的计算为反码+1。

又因为正数的原码、反码和补码相同,负数的补码为反码+1。所以上面的+8和-8的反码相加的结果 再加一 就是结果全0

+8和-8的补码相加为

00001000+11111000=00000000即全0 【1 0000 0000舍弃了高位1 】

   


二、第二种解释

补码的思想来源于时钟。逆时针旋转10小时,和顺时针旋转2小时,最后的指向是一样的。现在指向8h,8+10=8-2=6 指向的数一样。

即,减去一个数,等于加上另一个数,即0-a=0+b 0=a+b。因此不需要考虑数据是否为负数,直接把减法当作加法计算即可。


三、计算举例

1. 0110-0010即6-2=4。

利用加法的思想就是 0110 并不是减去了0010 而是加上了0010的相反数。

补码中,一对相反数的和为0,所以0010的相反数为1110。

即0110-0010= 0110+1110= 0100 【10100舍去高位1】

 2. 不知道最高位是否要计算到数值中的情况。

(1)(-56)+(-67)=-123

-56的补码为11001000,-67的补码为10111101,结果为10000101。 这时我们不知道最高位的1是单纯的符号位还是含数值,遇到这种情况,我们可以计算它的相反数。补码的一对相反数的和为0。

所以10000101的相反数为01111011也就是+123.

所以10000101是-123。

(2)-128

-128也是同理,遇到10000000我们不知道是否要计算最高位。那么先计算他的相反数,为10000000,即128。那么10000000这个数为-128。

这个128溢出了,8位补码的表示最大值为+127,没有+128。

-128需要特意记住。也可以这样记忆:在原码和反码中10000000表示-0,在补码中没有-0,所以补码多了一个表示。这个多的10000000用来表示-128。

计算方式再补充

补码的真值可以按照这个公式进行计算: -2^{n}*x_{n}+\sum_{i=0}^{n-1} 2^{i}x_{i}

n从0开始记,1000,这里n是3。

公式计算:1011= -1*2^3 + 0* 2^2+ 1*2^1 +1*2^0 即-5。

-128= -1* 2^7=-128

24/3/25补充:

计算方式证明

如上列出两种补码真值的计算方式,一种是-2^{n}*x_{n}+\sum_{i=0}^{n-1} 2^{i}x_{i}  【n为2的最高次方,比如1011,n为3】  设这个数为负数。

另一种是两个相反数的补码相加真值和为 0

第二种方式得出补码的真值应为: 0 -\sum_{i=0}^{n-1} 2^{i} (1-x_{i}) -1  

证明两个式子相等,都可以表示补码:

-2^{n}*x_{n}+\sum_{i=0}^{n-1} 2^{i}x_{i} = 0 -\sum_{i=0}^{n-1} 2^{i} (1-x_{i}) -1

-2^{n}*x_{n}+\sum_{i=0}^{n-1} 2^{i}x_{i} + \sum_{i=0}^{n-1} 2^{i} (1-x_{i}) +1 =0

-2^{n}*x_{n}+\sum_{i=0}^{n-1} 2^{i}(x_{i}+ 1-x_{i}) +1 =0

-2^{n}*x_{n}+\sum_{i=0}^{n-1} 2^{i} +1 =0

该数为负数,xn为1 ,所以有

-2^{n}+2^{n}-1+1 =0

即证。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值