Если я добавляю два двоичных числа со знаком с помощью метода Two Complement, почему это автоматически означает, что произошло переполнение, если перенос в MSB (знак) и выполнение не совпадают?
Дополнение до двух обнаруживает переполнение переносами
Ответы (1)
Уберем один факт.
Когда мы складываем отрицательный и положительный операнды, результат всегда будет в диапазоне представления. Переполнение происходит, когда мы складываем два числа с одинаковым знаком (положительное или отрицательное), а результат имеет противоположный знак.
Когда мы складываем числа в дополнении до двух, мы добавляем знаковый бит первого операнда со знаковым битом второго операнда.
Когда мы складываем положительные + положительные операнды, сумма битов знака равна 0.
0XXX (positive)
+ 0XXX (positive)
------
0XXX (positive)
Это означает, что неважно, что происходит, НИКОГДА не будет переноса при добавлении положительных + положительных операндов.
Итак, если в знаковых битах есть ручная кладь
1
0XXX (positive)
+ 0XXX (positive)
------
1XXX (negative)
Этот бит переноса 1 станет признаком результата. Это означает, что мы добавили два положительных операнда и в результате получили отрицательное число.
Выполнение = 0
Бит знака переноса = 1
ПЕРЕПОЛНЕНИЕ!
Когда мы складываем отрицательные + отрицательные операнды, сумма знаковых битов равна 0 с переносом.
1XXX (negative)
+ 1XXX (negative)
------
10XXX (positive)
Это означает, что неважно, что происходит, ВСЕГДА будет перенос при добавлении отрицательных + отрицательных операндов. Обратите внимание, что по умолчанию результатом будет положительное число. Ему "требуется" этот перенос, чтобы привести результат к тому же знаку операндов. Если есть перенос в знаковый бит, у нас будет два отрицательных операнда с отрицательным результатом.
Итак, если в знаковых битах отсутствует перенос
0
1XXX (negative)
+ 1XXX (negative)
------
10XXX (positive)
Этот переносимый бит 0 станет признаком результата. Это означает, что мы добавили два отрицательных операнда и в результате получили положительное число.
Выполнение = 1
Бит знака переноса = 0
ПЕРЕПОЛНЕНИЕ!