Когда я пытаюсь работать над целыми числами без знака в MIPS, результат каждой операции, которую я делаю, остается со знаком (то есть, целые числа - все в 2's дополнение), даже при том, что каждая операция, которую я выполняю, является неподписанной: addu
, multu
и таким образом четвертый...
Когда я печатаю числа в диапазоне [2^31, 2^32 - 1]
Я получаю их 'переполненную' отрицательную величину, как будто они были подписаны (я предполагаю, что они).
Хотя, когда я пробую что-то вроде этого:
li $v0, 1
li $a0, 2147483648 # or any bigger number
syscall
печатное число всегда 2147483647 (2^31 - 1)
Я смущен... Что я пропускаю?
PS: Я не включал свой код, поскольку это не очень читаемо (такой, ассемблерный код), и откладывающий эту проблему, кажется, хорошо работает. Если кто-либо чувствует, что необходимо, чтобы я включал его сразу же!
Из Википедии:
Набор инструкций MIPS32 гласит, что слово unsigned в составе инструкции Add and Subtract (Добавить и вычесть) - это неправильный термин. Разница между подписанной и неподписанной версиями команд не является знаковым расширением (или его отсутствием) операндов, а управляет тем, выполняется ли ловушка при переполнении (например, Add) или переполнение игнорируется (Add unsigned). Непосредственный операнд CONST для этих инструкций всегда является знаковым расширением.
Из MIPS Instruction Reference:
ВСЕ значения немедленной арифметики являются знаковыми расширениями [...] Единственное различие между знаковыми и неподписанными инструкциями заключается в том, что подписанные инструкции могут генерировать исключение переполнения, а неподписанные инструкции - нет.
Похоже, что настоящая проблема - это системный вызов, который вы используете для печати чисел. Похоже, что он всегда интерпретирует то, что вы передаете как подписанное, а также, возможно, и как связанное.