CO输出为1。这表示减法的最后一步要减去100000000。也就是说减数要大于被减数,结果为负。上面所示器件现在还不能表示负数。因此,上溢/下溢指示灯仅在加法器的CO输出为0时才会亮起。
你应该会庆幸自己问了这个问题:“减法该如何实现呢?”
本章一直在谈论负数,但是并没有提到负数在二进制中是如何表示的。你可能设想二进制会同十进制一样应用传统的负数符号。例如,-77在二进制中为-1001101。这样做当然可以,但是应用二进制数的目的恰恰就在于只希望用0和1来表示所有的东西,当然也包括负号。
当然,你可以简单地用一个二进制位来表示负号,当这一位为1的时候就表示负数,为0则表示正数,尽管这样也是可行的,但还远远不够。还有另一种方法可以解决负数的表示间题,而且它还可以很轻松地让负数和正数相加。这种方法的缺点是必须提前算一下可能遇到的所有数字的位数。
让我们来想一想。通常用来表示正数和负数的方法,其好处就在于能表示所有的正数、负数。我们将0想象为这个无限延伸的序列的中点。这个序列中正数沿着一个方向延伸,而负数则按照另一个方向延伸:
…-1000000, -999999…-3, -2, -1, 0, 1, 2, 3…999999, 1000000…
但是,如果我们并不需要无限大或无限小的数,而且在开始的时候我们就可以预知所使用的数字的范围,那情况就有所不同了。
以支票账户为例,这里人们通常会遇到负数。假设我的账户余额不超过500美元,并且银行给了我们500美元的无息预支额度,意思就是账户余额数值应该是一个在499美元到-500美元之间的数。假设我们不会一次取出500美元,我们也不会支出多于500美元的金额,这里我们用到的只是美元,不涉及美分。
这些假设表明账户能处理的额度是介于-500到499之间,总共1000个数。这个约束说明只用三位十进制数,且不用负号就可以表示所有需要的数字。我们并不需要用到从500到999之间的正数,因为我们所需要的数的最大值为499。因此从500到999的三位数可以用来表示负数。具体情况如下:
编码—隐匿在计算机软硬件背后的语言
156