减去 0x1 - 0x80000000 如何导致溢出?

How does subtracting 0x1 - 0x80000000 cause an overflow?

  MOV   R0, #0x80000000 
  MOV   R1, #0x1 
  SUBS  R2, R1, R0

根据 运行 此代码,设置标志 N 和 Z。现在,我知道如果运算结果为负,则设置 N 标志,当出现溢出时设置 Z 标志。

我不明白的是 0x1 - 0x80000000 是如何导致溢出的。感谢您的帮助!

考虑将这两个数字扩展到 36 位。当然,1 仍然是 1。 80000000 变成 f80000000。 1 - f80000000 = 080000001,正数。由于 080000001 作为正数不适合 32 位,因此存在溢出。

    1
 1000 
+1110
======

10001
 1000 
+1110
======
 0111

msbit 的进位和出位不一样...有符号溢出。