Я понял, что для двух целых чисел без знака я могу просто сделать это:
sll $a0, $a0, 31 #a0 is integer 1 to be added
sll $a1, $a1, 31 #a1 is integer 2
add $t0, $a0, $a1 #result in $t0
addi $t1, $0, 2
beq $v0, $t0, $t1
Что это делает, так это сдвигает 32-й бит обоих целых чисел в первое битовое место и добавляет их. Если оба эти числа равны 1, то ответом в $t1 будет 2 (01+01=10). Следовательно, произошло переполнение.
Однако для целых чисел со знаком ведущее означает отрицательные целые числа. Я исключил возможность переполнения, если оба целых числа имеют противоположный знак, но предположим, что они имеют один и тот же знак. Тогда 010 + 011 (два положительных целых числа) дадут мне 101, но потому что это знаковое. Это становится отрицательным целым числом. Могу ли я просто проверить, изменило ли число знаки? А для двух отрицательных целых чисел я могу просто проверить, как если бы они были беззнаковыми?
beq
имеет недопустимый синтаксис и использует$v0
без инициализации. Вы хотите сдвинуться вправо, поэтому вам нужноsrl
вместоsll
. И тест провален. Если оба числа равны -1 (т. е.0xFFFFFFFF
), при их сложении получается -2 (т. е.0xFFFFFFFE
). Это не вызывает переполнение. Но, я думаю, ваш тест подумает, что да. - person Craig Estey   schedule 08.03.2017