计算机如何计算减法
本文最后更新于 110 天前,其中的信息可能已经有所发展或是发生改变。

上次试着做了一个4位加法器,这次来做一个减法器。

要计算减法,那就会出现正负数,我们用0表示正数,1表示负数,并且最高位代表符号位。

例如 0001(+1) 1010(-2) 1100(-4) 以此类推,这样的表示叫做原码表示法

补码

时钟举例

我们先用时钟来举例,例如现在是下午4点整,时钟的表盘上只有12个数,因此现在的时针指向了4。

若我们要把4点整调成0点(12点),那么有两种方法:

  • 反向旋转时针 -4
  • 正向旋转时针 +8

这两种方法都可以达到目的,这是不是和正负数加减类似?

4 – 4实际上就是 4 + (-4),所以计算二进制减法的时候,可以类比时钟:

将4变成0只需要+8即可(时钟可以看做是12进制),因此得到了4+8=10这个结果,这时只需要舍去进位,剩下的本位就是我们要的结果。

二进制补码

二进制也是如此:

我们要使0100(+4)变成0000,只需要先加一个数让它变成1111,再继续+0001溢出,最后的四位结果就是我们想要的。

观察一下,只需要原来是1的位置+0、原来是0的位置+1即可达到目的,因此0100+1011=1111。

你会发现加上的数刚好是原来的数取反(0变成1、1变成0),最后我们再+0001溢出即可。

像这样把一个数取反再加一,叫做补码表示法,例如1101(-3),这样的数可以直接作为加法运算的加数。

结论

按照上面的思路,我们可以得出负数的计算步骤:加数+负数取反+1 = 结果。

实际操作

按照上面的结论,可以设计出如下逻辑电路,中间的是4位全加器,下面默认是A – B。

可以看到,我们给第一个半加器的 输入进位 输入了常量1(加法交换律,先加一也没问题awa)。

下面来验证一下它是否真正有用,还是拿4-4举例,这里只需要都输入0100(+4),因为默认了A – B,B已经取反了。

右边输出的结果是[1]0000(+0),结果没有问题,再试试4-3行不行…也就是A:0100 B:0011

可以看到结果是[1]0001(+1),也没问题,如果是3 – 4呢?

3 – 4的结果是[0]1111(+15),因此减法器并不能得到负数结果…

总结

减法器并不能计算出负数,当被减数小于减数时就会出问题。要解决这个问题可以先判断两数大小,若A>B则取反B 得到的结果是正数,A<B则取反A 得到的结果是负数,这个问题日后再讨论吧……

未经允许禁止转载本站内容,经允许转载后请严格遵守CC-BY-NC-ND知识共享协议4.0,代码部分则采用GPL v3.0协议
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇