Исключение переполнения MIPS
Я прочитал несколько постов здесь об исключении переполнения для подписанного и неподписанного дополнения MIPS, но мне все еще не ясно.
1) Что означает исключение переполнения и когда оно возникает? 2) Когда переполнение игнорируется для неподписанного дополнения?
Предположим, у меня есть два числа, давайте начнем с 4-битного со знаком и затем перейдем к 4-битному без знака
Signed negative addition
1010 -6
+ 1101 -3
------
1 0111 +7 with a carry(overflow) of 1, but result should have been -9.
Signed positive addition
0110 +6
+ 0011 +3
--------
1001 -7 with no carry(probably an overflow of 1), but actual result should have been +9.
Next is an unsigned addition
1111 +15
+ 1010 +10
---------
1 1001 +9 with an overflow/carry of 1, but actual result is +25.
Пожалуйста, дайте мне знать, в каком случае мы игнорируем исключение переполнения и в каком случае мы поднимаем исключение переполнения и почему. Я прочитал это для unsigned, мы всегда игнорируем переполнение, но тогда, если результат неправильный (9 вместо 25), почему мы игнорируем переполнение?
1 ответ
Различие в инструкциях добавления со знаком MIPS и без знака состоит в том, что исключение целочисленного переполнения генерируется для дополнений со знаком в случае переполнения дополнений 2, при котором исключение не генерируется для исключений без знака.
Инструкции описаны здесь: MIPS - Целое число - Арифметика.
Таким образом, в ваших примерах два "подписанных дополнения" (например, инструкция ADD) будут генерировать исключение, так как и переполнение дополнения 2 происходит, а "добавление без знака" (например, инструкция ADDU) не будет, даже если результат здесь также неверен, Таким образом, программист может контролировать, когда должно сгенерироваться переполнение дополнения 2 и возникнет исключение. Однако тогда набор инструкций не допускает 32-разрядного сложения без знака с переполнением от бита 32, поэтому, если вам действительно нужен последний бит, выполните 64-разрядную арифметику.
Смотрите эти посты также: