4 位二进制补码溢出

4-bit Two's complement overflow

我有一个我无法理解的概念性(ish)问题。我有一个作业,它告诉我选择以下哪个 4 位二进制(2 的补码)加法会导致溢出。以下是:

A得到10100,B得到11001,C得到1111,D得到10000

明明只有一个答案,但是A、B、D都产生了溢出。它们以 5 位而不是 4 位结束。当我问老师他是否想说其中哪一个不会产生溢出时,但他说这个问题是正确的。他给了我这个提示:

对于4位无符号数,溢出意味着2个数的和不能用无符号位表示。对于 4 位 2 的补码,溢出是指两个数的和不能用 4 位 2 的补码表示。

但这对我没有帮助,因为这已经是我的理解-对于A,B,D,总和无法用4位2的补码表示。我做错了什么?

对于二进制补码表示,表示的最高位具有负值:-(2k-1) 而不是 2k-1 用于 k 位表示。这意味着当您添加它们时,您不能只查看顶部全加器的进位(示例中的第 5 位输出)——您需要将其与进位 in 到最高位,只有两个进位不同时才会溢出。这里实际发生的是你减去进位到最高位,而不是添加它。

所以要更详细地查看示例 B:

first value     1 1 0 0
second value    1 1 0 1
carry value    1 1 0 0
result          1 0 0 1

所以在这种情况下,进位in到符号位与进位相同,所以不会溢出——1001的4位2s补码结果是正确的。

你必须忽略第五位。我们正在计算模 16,只有 4 位。

  • A -5 + -7 = -12 但结果 4
  • B -4 + -3 = -7
  • C 7 + -8 = -1
  • D -6 + 6 = 0

所以溢出发生在A.

第五位缺失。 在处理器中它会像一个溢出的进位标志。

只有当两项的符号相同时才会发生溢出:sign1 xor sign2 = 0。结果符号不同。 在处理器中通常有一个符号标志和这样一个溢出标志。

逻辑:-8 以下两个负数,或 7 以上两个正数。