Binary 如何在两个';补语是什么?

Binary 如何在两个';补语是什么?,binary,bit-manipulation,twos-complement,Binary,Bit Manipulation,Twos Complement,我看到当我用两个补码减去正数和负数时,我得到了溢出。例如,如果我从2中减去1,我得到: 2 = 0010 1 = 0001 -> -1 = 1111 2 + (-1) -> 0010 + 1111 = 10001 因此,这里的结果有第五个左位10001-是否溢出? 我发现了以下规则,用于检测带有两个补码的溢出: 如果两个正数之和产生负数结果,则 洪水泛滥。如果两个负数之和产生一个正数 结果,总数已溢出。否则,这笔钱就没有溢出 有人能详细说明一下这些问题并举例说明吗?让我们从回答标题

我看到当我用两个补码减去正数和负数时,我得到了溢出。例如,如果我从2中减去1,我得到:

2 = 0010
1 = 0001 -> -1 = 1111
2 + (-1) -> 0010 + 1111 = 10001
因此,这里的结果有第五个左位
10001
-是否溢出? 我发现了以下规则,用于检测带有两个补码的溢出:

如果两个正数之和产生负数结果,则 洪水泛滥。如果两个负数之和产生一个正数 结果,总数已溢出。否则,这笔钱就没有溢出


有人能详细说明一下这些问题并举例说明吗?

让我们从回答标题问题开始

如何在2的补码中检测溢出

溢出规则:如果加上两个符号相同的数字(正数或负数),则当且仅当结果的符号相反时,才会发生溢出

但在你的例子之后,你在问题的主体上问了一些不同的问题

因此,这里的结果有第五个左位
10001
-是否溢出

不!这里没有溢流。第五位是进位/借位。如果你说的是加法,就随身携带。如果你在谈论减法,那就借用一下

当您试图表示的数字超出可以表示的数字范围时,会发生溢出。在您的示例中,您使用的是4位2的补码,这意味着您可以表示
-8
1000
)到
+7
0111
)范围内的任何数字。减法
2-1
的结果是
+1
,该数字在表示范围内

当我们加上一个负操作数和一个正操作数时,结果总是在表示范围内。当我们将两个具有相同符号的数字相加(均为正或均为负)且结果具有相反符号时,会发生溢出

关于进位和溢出的大多数误解来自这样一个事实:我们使用进位作为参数之一来生成溢出标志。他们有着密切的联系,但他们不是一回事

在2的补码中添加数字时,如果最高有效位(符号位)的进位和进位不同,则表示发生了溢出

让我们看两个负操作数的正结果:

-8 + (-1) = -9 

 1000  (carry)
  1000 (-8)
+ 1111 (-1)
------
  0111 (+7) OVERFLOW!
进位为1,符号位(MSB)的进位为0

现在,我们来看一个两个正操作数和一个负结果的例子

+7 + 1 = +8

 0111  (carry)
  0111 (+7)
+ 0001 (+1)
------
  1000 (-8) OVERFLOW!

进位是0,进位到符号位(MSB)是1。

@GabrielOshiro的答案非常好。我只想在这里补充一点逻辑。当你把2和-1加在一起

2 = 0010
1 = 0001 -> -1 = 1111
2 + (-1) -> 0010 + 1111 = 10001
您应该将负数中的最高有效位与其他位分开,因为在2的补码中,该位会带来负值。因此,如果您首先添加所有其他内容:

0010 + 0111(leave out the leftmost 1 for now) = 1001
在这之后,我们可以清楚地看到,“10001”中的第五位是由于将前面留下的“1”(在第四位)与1001相加,从而在第五位产生进位。然而,由于这个“1”实际上应该与1001抵消,留给我们0001,我们可以安全地忽略“10001”中的额外位


更深入的推理将是考虑何时我们可以安全地忽略这一额外的部分,何时我们不能。正如@GabrielOshiro所提到的,当“从”和“继续”进入最重要的领域是不同的时,我们不能忽视它。在进位执行中,由于没有空间容纳多余的位,两个负数单位丢失,而在进位执行中,两个正数单位丢失,因为应该是正数单位的内容被视为负数单位。这里1-(-1)=2。因此,随身携带和随身携带将相互抵消。但是,如果只发生其中一个,结果将不正确,因此我们有一个溢出。

您的上一个示例不一致。
-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
吗?你必须检查标志位,符号位和进位的组合告诉你是否有溢出。例如。在您的示例中,结果是带有进位的
0001
,进位
1
谢谢,我将阅读一些关于
进位标志
溢出标志
的内容,然后回答问题)那么溢出发生后会发生什么?特别是如何在4位寄存器中表示-9?寄存器中是否类似于“1111”(或类似于“0111”)并使用触发器指示答案中有额外的“0”(或额外的“1”)位?我将澄清这个问题。在-9的情况下,实际答案是10111。在+8的情况下,答案应该是01000。那么,计算机如何知道溢出位是0还是1呢?