为什么MIPS在无符号数字上的操作会给符号结果?
问题描述:
当我尝试在MIPS无符号整数工作,每个操作我做的结果仍然签署了(也就是整数都在2的补数),尽管我每次执行操作是一个无符号之一:addu
,multu
等第四...为什么MIPS在无符号数字上的操作会给符号结果?
当我在[2^31, 2^32 - 1]
范围内打印数字时,我得到了它们的“溢出”负值,就好像它们被签名一样(我猜他们是)。
虽然,当我尝试这样的事:
li $v0, 1
li $a0, 2147483648 # or any bigger number
syscall
印刷数量总是2147483647 (2^31 - 1)
我很困惑...我缺少什么? PS:我没有包括我的代码,因为它不是非常可读的(这是汇编代码),抛开这个问题, 似乎工作正常。如果有人觉得有必要,我会马上加入!
答
的MIPS32指令集指出,作为无符号添加的部分单词和减指令,是用词不当。 命令的符号和无符号版本之间的差异是不操作数的符号扩展(或缺乏),而是陷阱控制是否在溢出执行(例如添加)或溢出被忽略(无符号添加)。这些指令的立即操作数CONST始终是符号扩展的。
所有算术立即值符号扩展[...]符号和无符号指令之间的唯一区别是,签署指令可以产生溢出异常和未签名的指令可以不。
答
它看起来像我真正的问题是你用来打印数字的系统调用。它看起来总是把你通过的东西解释为签名,并且可能会被绑定。
我一直在寻找所有过网的答案...任何地方,但明显。谢谢! – dankilman 2009-12-29 21:12:26
那么为什么他们使用的术语“符号和无符号”,而不是像“检查,并取消选中”? – dan04 2011-02-02 02:48:39
这是一个用词不当。阅读第一个报价。 – 2011-09-19 15:23:20