为什么MIPS在无符号数字上的操作会给符号结果?

问题描述:

当我尝试在MIPS无符号整数工作,每个操作我做的结果仍然签署了(也就是整数都在2的补数),尽管我每次执行操作是一个无符号之一:addumultu等第四...为什么MIPS在无符号数字上的操作会给符号结果?

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

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

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

印刷数量总是2147483647 (2^31 - 1)

我很困惑...我缺少什么? PS:我没有包括我的代码,因为它不是非常可读的(这是汇编代码),抛开这个问题, 似乎工作正常。如果有人觉得有必要,我会马上加入!

Wikipedia

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

MIPS Instruction Reference

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

+0

我一直在寻找所有过网的答案...任何地方,但明显。谢谢! – dankilman 2009-12-29 21:12:26

+0

那么为什么他们使用的术语“符号和无符号”,而不是像“检查,并取消选中”? – dan04 2011-02-02 02:48:39

+0

这是一个用词不当。阅读第一个报价。 – 2011-09-19 15:23:20

它看起来像我真正的问题是你用来打印数字的系统调用。它看起来总是把你通过的东西解释为签名,并且可能会被绑定。