算术溢出与算术运算

时间:2011-06-07 13:27:40

标签: math hex

我的一个演讲幻灯片给出了一个算术溢出的例子,并在ARM芯片上传入一个条件分支标志的主题,引用如下:

  • V(溢出) - 7FFFFFFF + 1
  • C(随身携带) - FFFFFFFF + 1

据推测,为了示例,地址只能容纳8个字节。所以对我来说,似乎喜欢添加1到7FFFFFFF给出80000000.我认为80000000仍然适合8字节地址。

为什么这是算术溢出?幻灯片上的方法是错误的吗?或者我的理解是否有缺陷?

感谢您的回复

3 个答案:

答案 0 :(得分:36)

  • 当寄存器无法将结果正确表示为有符号值(溢出到符号位)时,溢出标志置位。
  • 当寄存器无法将结果正确表示为无符号值(无需符号位)时,将设置进位标志。

答案 1 :(得分:6)

如果符号位已损坏,则会出现溢出。所以你知道你必须调整你的结果。

如果结果不符合此值,则会得到一个进位。 (需要比你更多的比特)。

在过去,您必须为多字节值编写自己的加法和乘法子程序。

答案 2 :(得分:0)

二进制补码的美妙之处在于 ADD 和 SUB 操作完全相同,因此您不需要对有符号和无符号值使用不同的指令。

然而,ALU 只处理一个 8 位数字存在一个问题,因此它不知道这些位是代表有符号数还是无符号数。

考虑两个操作:

  1. 255 (AKA -1) ADD 1 无论哪种方式,答案都是 0。但是,如果 255 表示 -1,则此操作很好 -1 ADD 1 = 0 没问题。 OTOH 如果 255 是无符号的 255 ADD 1 = 0 是错误的,所以 ALU 设置 C 标志说“如果这是一个无符号操作,它超出了界限”

  2. 127 添加 1 个答案 128(又名 -128)。如果 127 代表一个无符号数,这很好 127 ADD 1 = 128,但是如果它的有符号数 127 ADD 1 = -128 是错误的。因此,在这种情况下,ALU 设置了 V 标志,表示“如果这是一个有符号操作,则答案越界”

原则上你可以设计一个只有一个标志的 ALU,如果你有一点告诉它操作是有符号的还是无符号的。那么对于有符号和无符号操作,你会有不同的操作码。