减法
相减结果为正的减法
如下一篇拙言,是自己平时的总结,如有错误欢迎各位大佬指正。
相信你一定听说过,补码,取反加一等等关于介绍减法的词汇和语言,下文将使用最“啰嗦”最经典的方法带你们彻底了解计算机减法的世界。
因为减法有时需要进行借位,且过程繁琐,因此需要对其进行简化。
例如 245-158
在进行计算时
245-158
= 245-158+999+1-1000
= 245 + (999-158) + 1 - 1000
你可能会像这不依然需要使用减法吗?反而使步骤变得更加繁琐!!!
但是你可能忽略了最重要的一点这种方法不需要麻烦的使用借位来进行运算了
你可能又会觉得这又有什么用……
那就请各位看官用另一个角度来进行思考
我门进入二进制的世界来思考这个问题
首先给出245
和158
的二进制表示:1111 0101b
和 1001 1110b
我们使用同样的思路将二进制的减法进行转化
1111 0101-1001 1110
= 1111 0101-1001 1110+1111 1111+1-1 0000 0000
= 1111 0101 + (1111 1111-1001 1110) + 1 - 1 0000 0000
如果大家还是不能看出其中端倪,依旧觉着还是需要设计减法电路来进行减法运算,那就请听我细细说来
如果你突然间,一不小心发现如下的一个事实,那你就全懂了
在1111 1111-1001 1110
的运算过程中
每一位进行相减时,只要减数是1那么结果就是0,只要减数是0那么结果就是1.
根据这个规律,我们只需要看着10011110
这个数就能马上知道结果是01100001
,这两个数正好是取反的
我们将结果和一开始的被减数(1111 0101
)进行相加将会得到结果(1 0101 0110
)在加1
得到1 0101 0111
在减去1 0000 0000
就是上面计算的最终结果
但是对于8位二进制的运算,最高位的1其实已经溢出了,本身就是无效的
因此在二进制中加完后我们只需要取得和原先相同数据长度的低位就完成了上述的减法运算
在数字电路中取反运算那简直是太简单了
因此在二进制的世界中减法已经被完全被加法所替代
换句话将,如果你已经设计出了一个二级制加法器后,你愿意花费更多的时间去设计带借位输入和输出的减法器,还是愿意设计一个取反电路???
如果你足够细心,相信你已经发现了,上述中999-158
的结果其实就是一个补数对9的补数,而1111 1111-1001 1110
的结果其实就是一个对1的补数,虽然我并没有阐述补数的定义相信大家大致已经明白了什么是补数。
好了,罗里吧嗦了一大堆,最后感谢可以耐心看完的每一位读者!!!
嘿嘿(●ˇ∀ˇ●),你以为这就结束了?
大家设想一下如果将上面的减数和被减数翻过来呢变成158-245
相信以大家的聪明才智,都明白了吧,好本章到此结束。
开个玩笑,好了,我知道了,你不用问了,我不认为自己有多幽默!!!
问题来了负数怎么办???
相减结果为负数的减法
依然如此,老规矩咱们先走一下上一张的流程
158-245
= 158 + (999-245) + 1 - 1000
= 158 + (999-245) - 999
= 158 + 754 -999
= 913 - 999
= ???
于是突然发现,好像上一章使用反相器和加法器替代减法突然变成了扯淡一般,这**不是逗我玩儿吗???
于是突然间觉得事情好像没那么简单,但仿佛又没那么难
我们只需要找到一种表示负数的方法即可继续想办法进行操作,再书写中只需要在前面加一个 -
号即可,可是再计算机中如何存储呢?
又如何通过数字电路中表示呢?
当然我们可以使用一个二进制来表示负号例如使用0
表示后面的二进制为正数,使用1
表示后面的二进制为负数。
可这是远远不够的,因为你还是需要设计有一个电路来实现正数和负数的相加,而且你还需要设计电路来识别这是正数还是负数,尽管识别电路是比较简单的判断最高位是0
或是1
即可。
未完待续!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)