14

当我尝试在 MIPS 中处理无符号整数时,我所做的每个操作的结果都保持有符号(也就是说,整数都是 2 的补码),即使我执行的每个操作都是无符号的:addumultu所以第四个......

当我打印该范围内的数字时,[2^31, 2^32 - 1]我得到它们的“溢出”负值,就好像它们已签名(我猜它们是)。

虽然,当我尝试这样的事情时:

li $v0, 1
li $a0, 2147483648                # or any bigger number
syscall

打印的数字总是2147483647 (2^31 - 1)

我很困惑......我错过了什么?

PS:我没有包含我的代码,因为它不是很易读(例如汇编代码)并且抛开这个问题,似乎工作正常。如果有人觉得有必要,我会立即将其包括在内!

4

2 回答 2

21

来自维基百科

MIPS32 指令集指出,作为加减指令的一部分的无符号字是用词不当。命令的有符号和无符号版本之间的区别不是操作数的符号扩展(或缺少符号扩展),而是控制是否在溢出时执行陷阱(例如添加)或忽略溢出(添加无符号)。这些指令的立即操作数 CONST 始终是符号扩展的。

来自MIPS 指令参考

所有算术立即数都是符号扩展的 [...] 有符号指令和无符号指令之间的唯一区别是有符号指令可以产生溢出异常,而无符号指令则不能。

于 2009-12-29T20:48:32.833 回答
2

在我看来,真正的问题是您用来打印数字的系统调用。它似乎并且总是将您传递的内容解释为已签名,并且也可能会绑定。

于 2009-12-30T00:18:08.260 回答