我正在尝试编写一个代码,可以添加2个数字,即使它们是32位长。但是,如果我添加两个32位数字,或者如果我添加两个32位数字(如2bi + 2bi),我的程序将无法工作。在第一种情况下,我得到“无效的整数输入”错误,在第二种情况下,我得到“算术溢出”错误。我认为第32位用于“+”或“ - ”信号。我怎样才能解决这个问题?
li $v0, 4
la $a0, primeiro.num #asks for the first number
syscall
li $v0, 5
syscall
move $s0, $v0
li $v0, 4
la $a0, segundo.num #asks for the second number
syscall
li $v0, 5
syscall
move $s1, $v0
blt $s1, $zero, erro_num_neg
add $s2, $s0, $s1
使用addu
/ addiu
进行纯二进制加法。从顶部位进位输出被丢弃,并且没有对2的补码有符号溢出进行检查,因此它只是包含无符号或有符号加法。
你应该只使用add
/ addi
,如果你特别希望它在签名溢出时引发异常。 (例如,检测出这是一个错误并且您希望程序中止而不是继续包装数据的情况。)
即使对于带符号算术,C编译器也不使用MIPS add
。带符号溢出是C中的未定义行为,因此它们可以在某些情况下使用它(当asm操作数具有C抽象机器中存在的值,而不是重新排序的结果或某些东西时),但大多数编译器选择不这样做。