国庆期间,我造了台计算机( 四 )


因此需要改装一下 , 两个半加器合起来再加一个或门 。
国庆期间,我造了台计算机文章插图
假设 A 输入 1,B 输入 1 ,进位输入 1 , 从最左边开始第一个半加器 S 输出 0,CO 输出 1 , 第二个半加器 S输出 1 , CO 输出 0 , 最终和输出 1 , 进位输出 1 , 结果没毛病可行 , 这叫全加器 , 简化一下图:
国庆期间,我造了台计算机文章插图
全加器有了 , 咱们得组合起来 , 并且需要有输入和输出 , 我们通过开关来输入数字 , 由灯泡的亮暗显示结果 。
国庆期间,我造了台计算机文章插图
这就是一个 8 位的计算器 , 有 9 个灯是因为两个 8 位相加结果可能是 9 位 。
然后从最右边开始如下图所示接上全加器 , 进位接地表示 0 输入 。
国庆期间,我造了台计算机文章插图
中间的都如下接法 , 前一个的进位输出是下一位的进位输入 。
国庆期间,我造了台计算机文章插图
最后一个就是把进位输出直接接到第九个灯上就行了 。
国庆期间,我造了台计算机文章插图
此时你摆动控制面板的开关 , 就可以通过机器得到相加的结果 。 简化的画法如下图所示:
国庆期间,我造了台计算机文章插图
现在我们已经造出了八位加法器了 , 如果要 16 位呢?简单合一下就好了 。
国庆期间,我造了台计算机文章插图
当然真实的计算机原理差不多是这样的 , 不过会更复杂 , 比如不会像我们的加法器 , 一个一个地进位加 , 而是会先行进位 , 而且也不会用继电器 , 而是晶体管等等 。
减法怎么弄?加法器我们搞出来了 , 那减法怎么做?减法需要有借位操作 。
我们先拿熟悉的十进制来说 。 假设你的账户上限是499 , 你的透支额度是500 , 也就是说你的账户金额范围是 -500~499 这 1000 个数字 , 要求不能用负号来表示 。
可以看到这是个三位数 , 而最大值就到 499 过 , 说明 500~999 之间的数没用 , 那拿来表示负数不就刚刚好吗?
所以让 500 表示 - 500, 501 表示 -499 , 以此类推 。
500,501.......998,999,000,001......498,499 , 让5、6、7、8、9开头的数都代表负数 , 而且是不是看起来还形成了个环形 ,499 + 1 就变成 500 了 , 然后 999 + 1 变成 1000, 但是只能三位数表示 , 所以溢出了变成 000 。
这种处理叫 10 的补数 , 如果要把三位负数转为 10 的补数 , 就是让 999 减去它再加一 , 也就是说 10 的补数等于 9 的补数加一 。
补数的概念:拿 9 的补数来说 , 将一个数从一串 9 中减去得到的结果就叫这个数 9 的补数 , 比如 123, 它是三位数, 999-123 = 876, 所以 123 的 9 的补数就是 876 , 如果把结果 + 1那就是 10 的补数了 。
就拿 -499 来说 , 我们要转化成补数 , 就是 999 - 499 + 1 等于 501, 看上面的排列确实用 501 来代表 - 499 。
那减去一个数不就是加上一个数的负数吗?所以通过补数我们就不需要做减法 , 只需要转成补数再相加就行了!
现在我们再换成二进制 , 二进制相比于十进制就更简单了 。
拿八位二进制数来说 , 范围是 00000000~11111111 ,对应的十进制是 0~255 , 但现在我们想让它能表示负数 , 前面十进制的时候我们将 5、6、7、8、9开头的正数来表示负数 , 对应于二进制我们可以将第一位以1开头的作为负数 。


推荐阅读