【发布时间】:2015-12-24 15:19:12
【问题描述】:
我看到当我使用two's complement 减去正数和负数时,我得到了溢出。例如,如果我从 2 中减去 1,我会得到:
2 = 0010
1 = 0001 -> -1 = 1111
2 + (-1) -> 0010 + 1111 = 10001
所以这里的结果有第五个左位10001 - 它溢出了吗?
我发现这些规则用于检测到带有二进制补码的溢出:
如果两个正数之和产生负数,则和 已溢出。如果两个负数之和产生一个正数 结果,总和溢出了。否则,总和没有溢出。
任何人都可以详细说明这些并显示示例吗?
【问题讨论】:
-
你的最后一个例子是不一致的。
-1的值以四位给出,但您的答案以五位计算。如果字长是 5 位,那么-1的值应该是11111,而不是1111。在 5 位字中,1111是值15,而不是-1。您计算了2 + 15 = -15。另外,您的编程问题是什么? (这还不是真正的编程问题。) -
对不起,我不明白。我将
-1转换为四位,然后添加并接收五位。我应该怎么做? -
您添加了两个带符号的 4 位值并生成了一个 5 位结果,这会使 4 位值的原始计算无效。这就像向某人展示一个 1 升的水桶并告诉他们,“将它装满,除了 5 毫升。”他们在里面放了995毫升。你有另一个装有 10 毫升水的桶。你把它们都倒进一个 10 升的桶里,然后说:“嘿,10 升的桶没有溢出。那个人在 1 升的桶里放错了水量,因为我预计它会溢出 5 毫升!”
-
@RaymondChen,好的,你能告诉我如何使用四位来做
2-1吗? -
你必须检查符号位,符号位和是否有进位的组合告诉你是否有溢出。 See here 例如。在您的示例中,结果是
0001带有进位1
标签: binary bit-manipulation twos-complement