【问题标题】:Why do MIPS operations on unsigned numbers give signed results?为什么对无符号数的 MIPS 运算会给出有符号结果?
【发布时间】:2009-12-29 20:32:38
【问题描述】:

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

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

但是,当我尝试这样的事情时:

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

打印的号码始终为2147483647 (2^31 - 1)

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

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

【问题讨论】:

    标签: mips unsigned


    【解决方案1】:

    来自Wikipedia

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

    来自MIPS Instruction Reference

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

    【讨论】:

    • 我在网上到处寻找答案……除了显而易见的问题。谢谢!
    • 那他们为什么使用“有符号和无符号”的术语而不是“已检查和未检查”之类的词呢?
    • 用词不当。阅读第一句话。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多