原码,反码,补码的用途

问题: 为什么计算机里要存在补码,只有反码不可以吗?

我们想求 2 - 1,但我们不想在计算机内部用减法去完成这件事

所以,我们可以曲线救国,利用高位溢出,使用2 + 127-128去完成

什么叫高位溢出呢?

1111 1111 + 0000 0001 结果是1 0000 0000 ,但新的最高位计算机保存不下,就抛弃了

上述过程转换成十进制即:(目的)127 + 1 ==> (实际)127 + 1 -128 ==> 0

如果不用补码直接用反码会发生什么呢?

先来看一下 怎么求出反码:

原码:0000 0001

反码:1111 1110

原码是1,反码就变成了 126。

发现规律了吗?

反码是由 1111 1111 - 0000 0001 得到的,即127 - 1得到的

回到上面,如果 -1 在内部用反码存储,2 + (- 1) 就会变成 2 + 126 - 128 = 0,与目标数值1相比小了1

从二进制角度看一下上述过程

0000 0010 + 1111 1110 = 1 0000 0000

根本原因是什么?

最高位不一致。我们的目的是让 -1 在内部保存为 127(即128-1),这样就可以通过高位溢出,最后减去128得到原来的值 -1。

但是128的二进制是1 0000 0000,位数超过了8位,计算机内部保存不了,所以没办法直接使用128-1得到127。

反码最大只能是127,二进制即1111 1111,这是计算机内部可以保存的最大数值,离 128 差了0000 0001。

因此,需要存在补码【反码 +1 =(127-x)+ 1 = 127+1 - x】,这样就可以得到 128 - x。

最后,我们就能够达到最终目的:利用高位溢出可以使加法变成减法。

分析完毕,上述只拿了8位的int举例,16位36位也是如此。


上一篇
什么是钩子 什么是钩子
什么是钩子钩子源于hook,即在消息过去之前先把消息钩住,不让消息执行,自己先优先处理。 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制
2021-05-10
下一篇
使用GitHub Action进行hexo自动化部署 使用GitHub Action进行hexo自动化部署
当自己使用github action完成hexo自动化构建时非常开心!!!相当有成就感!!虽然不是什么大佬的操作,但也算是自己用技术改变自己的生活了!然鹅开心之后发现自己并没有什么人可以分享= =所以就来写篇博客吧~ 参考文章:http
2021-04-15 One fly bird
目录