我对 add 和 addu 之间的区别感到困惑。
MIPS 指令参考说:
- 添加(有溢出)
- 添加无符号(无溢出)
我的理解是将 add 与带符号的操作数一起使用,将 addu 与无符号的操作数一起使用。
但是让我们考虑这个例子(只有 6 位):
溢出 | 五 1 | 1 1 1 <- 携带 | 1 1 1 1 0 1 + | 1 1 1 1 1 0 = ----------------- | 1 1 1 0 1 1
这是我的推理:
- 如果我考虑第一个和第二个操作数有符号数字(二进制补码),那么结果是正确的(-3 + -2 = -5)并且我不想要溢出异常。所以我会使用 addu 来避免这个异常,但是,虽然结果是一样的,但顾名思义,使用 addu 是为了无符号数!
- 如果我考虑第一个和第二个操作数无符号数,那么我希望引发异常(因为 61 + 62 不等于 59)。所以我会使用 add 来引发异常,而不是 addu,正如名字所暗示的那样。
现在我的问题是:
- 假设操作数是有符号的(在上面的例子中是负数)数字,我应该使用 addu (正如我的推理所暗示的那样)还是应该使用 add (顾名思义)?
- 假设操作数是无符号(正)数,我应该使用 add (正如我的推理所示)还是 addu (顾名思义)?