我有一个问题来自帕特森的计算机组织书。
在这里,他们给出了两个数字A和B,它们是8位有符号整数。A 和 B 的值分别为 216 和 255。他们要求找到 A+B 和 A - B,并报告是否有任何溢出/下溢。
现在我的疑问是 - 您甚至不能用 216 位有符号数字表示 8。范围为 [-128,127]。所以这个问题是无效的!!
如果有人证实我的怀疑,我将不胜感激。
谢谢。
这个问题一点也不无效。 事实上,这种类型的问题很常见,以确保您理解溢出/下溢,只需围绕位表示,例如当里程表在里程变得过高时滚动到所有零时。 由于我也是计算机科学系的教师,我将尝试在不直接回答帕特森问题的情况下提供帮助。
你本能地觉得 216 在有符号的 8 位数字中是不可表示的,这是正确的,但让我们看看这些东西实际上是如何工作的。
假设您有一台已签名的 4 位机器,需要存储数字 -11。 您可能很聪明,请注意有符号 4 位数字的范围是 [-8,7],因此 -11 一定是不可能的。 不是这样...首先,商店11...一般来说是 0000...0000001011_2,但我们必须将其压缩为 4 位,除了低阶 4 位之外,其他所有位都丢失。 所以 11 = 1011_2。 在这一点上,你可能会说,"但这不是一个负数吗? 好吧,如果您有任何马,请握住它们一分钟。 现在将 4 位 11 求反以获得 4 位 -11...2s comp 否定需要翻转所有位并加 1,因此 -1011_2 = 0100_2 + 1 = 0101_2。
好了,你现在可以别再牵马了。 确实,0101_2 实际上是 +5,但它是否也和 -11 一样好? 还记得你早期的数学时代,你的老师告诉你要检查你的成绩?...我们可以在这里做同样的事情,让 +5 与 -11 相同,感觉温暖舒适。 例如 -11 + 6 = -5,对吧? 因此,如果我们在 0101_2 中加上 6 并得到 -5,我们应该对我们看似超出范围的 -11 感到满意,对吗? 答案是肯定的!:-) 所以让我们看看...6 = 0110_2 在 4 位中,现在让我们添加。
0101
+ 0110
------
1011
那么什么是 1011_2? 这是负面的;我们可以判断,因为符号位(最左边的位)是 1。 要找到它的大小,我们可以否定它... -1011_2 = 0100_2 + 1 = 0101_2,令我们惊讶的是 5,所以原始结果 1011_2 是 -5,这是人们应该预料到的答案。
也许我们不相信这是可以的。 让我们通过添加 14 来验证 -11 是否为 0101_2。 这应该给我们一个 3 的结果,因为 -11 + 14 = 3。 呃哦...14 似乎也超出了范围,但让我们像机器一样工作,按照我们的要求去做,无论它看起来多么愚蠢。 +14 通常是 0000...0001110_2,但我们必须通过丢失除低阶 4 位之外的所有位来将其压缩为 4 位。 所以有符号 4 位中的 +14 是 1110_2。 让我们将其添加到 -11...
0101 // -11
+ 1110 // +14
------
10011 ...but this also needs to get squeezed into 4 bits, so it's 0011
嘿,0011_2 和 +3 不是一回事吗? 是的! 因此,看起来您实际上可以存储出现在明显范围之外的数字,并且它们仍然可以准确地用于至少一些数学运算。
因此,希望这能让您了解如何以有符号的 216 位格式存储 8 和 8 位。 但是我会把溢出/下溢的检测留给你:-P
祝你好运。