Math 如何在二进制级别检测溢出?

Math 如何在二进制级别检测溢出?,math,binary,hardware,Math,Binary,Hardware,我正在读亨尼西和帕特森的《计算机组织与设计》(第四版)。在第225页,他们描述了如何在有符号2的补码算法中检测溢出。我甚至不明白他们在说什么 “当发生[溢出]时,我们如何检测它?显然,添加或 将两个32位数字相减可以得到需要33位的结果 充分表达。” 当然。它不需要34位,因为即使最小的34位数字也是最小的33位数字的两倍,我们要加上32位数字 缺少第33位意味着当溢出发生时,符号位 设置为结果的值,而不是正确的符号 结果如何。” 这是什么意思?符号位用结果的“值”设置。。。这意味着它被设置为结

我正在读亨尼西和帕特森的《计算机组织与设计》(第四版)。在第225页,他们描述了如何在有符号2的补码算法中检测溢出。我甚至不明白他们在说什么

“当发生[溢出]时,我们如何检测它?显然,添加或 将两个32位数字相减可以得到需要33位的结果 充分表达。”

当然。它不需要34位,因为即使最小的34位数字也是最小的33位数字的两倍,我们要加上32位数字

缺少第33位意味着当溢出发生时,符号位 设置为结果的值,而不是正确的符号 结果如何。”

这是什么意思?符号位用结果的“值”设置。。。这意味着它被设置为结果未签名?如果是这样的话,第33位的缺失又是如何产生的呢

“因为我们只需要一个额外的位,所以只有符号位可能是错误的。”

那就是他们完全失去我的地方

我从中得到的是,当添加有符号的数字时,当且仅当符号位错误时,才会出现溢出。所以如果你加上两个正数得到一个负数,或者如果你加上两个负数得到一个正数。但我不明白他们的解释

而且,这只适用于无符号数字,对吗?如果您要添加有符号的数字,那么检测溢出肯定要简单得多。如果ALU的最后半个加法器设置其进位,则会出现溢出


注意:我真的不知道什么标记适合这里,请随意编辑它们。

由于32位有符号整数由1个符号位和31位表示实际数字,我们实际上是在添加两个31位数字。因此,第32位(符号位)将是溢出可见的位置

缺少第33位意味着当溢出发生时,符号位被设置为结果值,而不是结果的正确符号

想象以下两个正数的加法(simpify为16位):

但是,对于两个大负数的求和,需要额外的位

  1100 1100 0011 1010  
+ 1110 0010 0001 0010  
=11010 1110 0110 1100  

通常,CPU将此第33位(或其在+1上运行的任何位大小)作为溢出位在微体系结构中公开。

它们的描述涉及对具有特定位序列的值的操作:第一位对应于值的符号,其他位与该值的大小相关

这是什么意思?符号位用结果的“值”设置

他们的意思是溢出位——这是两个数字相加的结果,需要溢出到下一个数字中——被转储到符号位应该位于的同一位置

“因为我们只需要一个额外的位,所以只有符号位可能是错误的。”

这意味着,当您执行溢出的算术运算时,唯一的值可能不正确的位是符号位。所有其他位仍然是它们应该的值


这是上文所述的结果:符号位的值因溢出而混淆。

任何时候你想要处理这类ALU项,无论是加法、减法、乘法等,都要从2或3位数字开始,比32或64位数字更容易获得句柄。在2位或3位之后,不管是22位还是2200位,从那时起,所有的工作方式都完全相同。基本上,如果您想要创建一个包含所有3位操作数及其结果的表,以便可以直观地检查整个表,那么您可以手动创建一个包含所有32位操作数及其结果的表,但是,手动创建一个包含所有32位操作数及其结果的表无法在合理的时间内完成此操作,并且无法直观地检查整个表

现在,两个补码,这只是一个表示正数和负数的方案,它不是任意的东西,它有一个原因,疯狂的原因是你的加法器逻辑(这也是减法器使用的,与乘法器使用的是同一种东西)不关心无符号或有符号。它不知道有什么区别。程序员关心的是,在我的三位世界中,位模式0b111可以是正七(+7),也可以是负七。相同的位模式,将其输入加法逻辑,得到相同的结果,我可以选择将结果解释为无符号或两位补码(只要我将操作数和结果都解释为无符号或两位补码)。Twos补码还有一个特性:对于负数,设置最高有效位(msbit),对于正数,设置为零。所以它不是符号加幅度,但我们仍然谈论msbit是符号位,因为除了它告诉我们的两个特殊数字,数字的符号,其他位实际上告诉我们幅度,它们不是符号加幅度符号中的无符号幅度

所以,整个问题的关键是理解你的极限。对于3位无符号数,我们的范围是0到7,0b000到0b111。对于3位有符号(两个补码)解释,我们的范围是-4到+3(0b100到0b011)。现在把我们自己限制在3位,如果你加上7+1,
0b111+0b001=0b1000
,但是我们只有一个3位的系统,即0b000,7+1=8,我们不能在系统中表示8,所以这是一个溢出,因为我们碰巧将这些位解释为无符号的,我们看的是“无符号溢出”,也被称为进位或标志。现在,如果我们取这些相同的位,但将它们解释为有符号的,那么0b111(-1)+0b001(+1)=0b000(0)。负一加一等于零。无溢出,未设置“签名溢出”…什么是签名溢出

首先,什么是“未签名溢出”

无论寄存器中有多少位,为什么“它都工作相同”与
  1100 1100 0011 1010  
+ 1110 0010 0001 0010  
=11010 1110 0110 1100  
  1
  09
 +01
====
  10
  111 
   111
 + 001
=======
  1000
  111 
   111
 + 001
=======
   000
  abc
  100 
   110
 + 100
======
   010
  abc
  010
   010
 + 010
======
   100
   010
 + 010
======
   100
x ab cr 
0 00 00
0 01 01
0 10 01
0 11 10 signed overflow
1 00 01 signed overflow
1 01 10
1 10 10
1 11 11
  111H
   111
 + 001
=======
  1000
    1
  011
+ 101
=====
 1111
  011
+ 101
=====
  001
add f,b,d
addc e,a,c
add f,b,d
addc e,a,c
addc x,y,z