补码是如何把减法转化为加法的?
创作时间:
作者:
@小白创作中心
补码是如何把减法转化为加法的?
引用
CSDN
1.
https://blog.csdn.net/puss0/article/details/115265281
我们都知道在计算机中,数字是以补码的形式存储的,好处就是利于减法计算,可是为什么呢?让我们来试图回答以下几个问题。
- 什么是补码,如何计算?
- 补码如何将减法转化为加法?
但凡编程入过门,都知道补码是怎么回事。正数的补码是其自身,负数的补码是其绝对值取反加一。
在这里我们不考虑正数,因为正数没有补码,其实是不需要更准确。我们只看负数的补码,这里有两个信息:取反和加一。由这两个信息引出两个问题: - 取反是什么意思?
- 为什么要加1?
二进制不符合人的直观认知,所以我们在十进制下来看看补码的计算。以
15-7
为例,用补码计算。
首先我们假设数字位宽是4位,最高位为符号位,
15
表示为
0015
,
-7
应该是
1007
。但我们清楚的知道这样计算出来的结果
0015+1007=1022
是不对的。我们要将
-7
用补码来表示,这里涉及第一个问题,如何取反?
在二进制中取反就是
0
变
1
,
1
变
0
,那么在十进制中取反的含义是什么呢?
取反的本质是该进制下的极数减去原数。所谓极数就是该进制所能表达的最大数,比如4位十进制所能表达的最大数是
9999
,那么
-7
取反就是
9999-7=9992
。所以,为什么二进制取反是0/1互换呢,因为二进制所能表达的极数是
1111
,相减的结果当然就是0变1,1变0了。
知道了如何取反,那么
-7
的补码就是
9992+1=9993
,现在在来计算
15-7
,就变成了
0015+9993=10008
,但是由于我们只有4位位宽,所以最高位的1会被截断,最终结果变成
0008
!
看到这里,是不是就觉得补码计算没那么神奇了。我们将计算过程进一步展开:
15 − 7 = 0015 − 0007 = 0015 + 9999 − 0007 + 1 = 0015 − 0007 + 9999 + 1 = 0015 − 0007 + 10000 = 0015 − 0007 \begin{aligned} 15-7&=0015-0007\&=0015+9999-0007+1\&=0015-0007+9999+1\&=0015-0007+10000\&=0015-0007 \end{aligned}15−7 =0015−0007=0015+9999−0007+1=0015−0007+9999+1=0015−0007+10000=0015−0007
从上面的过程中我们可以清楚的看到减法是如何变成加法的,以及补码取反之后为什么要加1。现在我们再来审视前面提出的问题,补码把减法变成加法的原理是位宽溢出。我们之所以可以做直接做加法,是因为补码已经帮我们做了一次减法,就是求反码的时候。只不过在二进制中,求补码的减法刚好就是取反!所以,取反的意思其实是做减法。
再次回到文章标题,其实补码并没有将减法转化为加法,而是补码帮你做了减法。
最后我们再来看看为什么正数没有补码,因为补码中蕴含的是减法运算,而正数代表的是加法运算,负数代表的才是减法运算。
热门推荐
粥是最差的主食吗?早餐到底能不能喝粥?钟南山:早餐应该这样吃
如何搭配营养早餐?速点这份搭配指南
急性胰腺炎治疗迎来突破:乳酸林格氏液成首选
急性胰腺炎患者营养管理指南:从禁食到恢复正常饮食
中山医院专家推荐:如何通过饮食预防急性胰腺炎?
远离急性胰腺炎:饮食调整与体检筛查双管齐下
七色糙米饭:营养均衡的五谷杂粮组合及烹饪秘诀
珠海十大景点全攻略:从海洋王国到日月贝,玩转滨海之城
湖南省第二人民医院教你春节防肠胃炎
饮食卫生:如何有效预防急性肠胃炎?
得了急性肠胃炎?小米粥来救急!
老话“十一请子婿” 怎么请?了解下
科学家发现探测戴森环新技术:或能捕捉外星文明踪迹
惊现戴森球疑踪:天文学家在距离地球1000光年范围内锁定7个目标
自2015年后,戴森球的新消息来了
中药汤剂、颗粒剂、膏方,哪个好?
中医视角下对失眠的看法及其调养方式
正月十一啥日子?记得吃4样、做2事,日子越过越红火,莫忘老传统
早餐建议常吃这10种食物,补充蛋白质钙元素丰富,再贵也要舍得吃
什么燕麦食品更适合血糖高的人群?
澳洲每月超3万人吃不上饭,越来越多人开始排队领救济!慈善机构也“扛不住”了...
红楼梦中林黛玉的全部诗词
香港五天游,跟团还是自由行?一文帮你做出最佳选择!
快递春节正常派送,我看到了行业残酷的一面
推进农村物流体系发展,激发乡村振兴新动能
肝火旺盛,这些身体信号你察觉到了吗?
2025年房地产市场新动向:京津冀领跑
因特拉肯:瑞士必打卡历史文化胜地
冬季滑雪必打卡:瑞士少女峰
瑞士双璧:少女峰与马特洪峰的世界遗产之旅