0

我正在尝试编写一个可以添加 2 个数字的代码,即使它们是 32 位长。但是,如果我添加两个 32 位数字,或者如果我添加两个组成 32 位数字的数字(如 2bi + 2bi),我的程序将无法工作。在第一种情况下,我收到“Invalid Interger Input”错误,在第二种情况下,我收到“Arithmetic Overflow”错误。我认为第 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
4

1 回答 1

0

使用addu/addiu进行普通二进制加法。最高位的进位被丢弃,并且不检查 2 的补码有符号溢出,所以它只是作为包装无符号或有符号加法。

只有在您特别希望它在签名溢出时引发异常时,您才应该使用add/ 。(例如,检测这错误的情况,并且您希望程序中止而不是继续处理包装的数据。)addi


add即使是有符号算术,C 编译器也不使用 MIPS 。有符号溢出在 C 中是未定义的行为,因此他们可以在某些情况下使用它(当 asm 操作数的值存在于 C 抽象机中,而不是重新排序的结果或其他东西时),但大多数编译器选择不这样做。

于 2019-03-30T21:19:26.057 回答