Дополнение до двух обнаруживает переполнение переносами

Если я добавляю два двоичных числа со знаком с помощью метода Two Complement, почему это автоматически означает, что произошло переполнение, если перенос в MSB (знак) и выполнение не совпадают?


person Nic    schedule 28.03.2014    source источник
comment
Должен сказать, это вопрос, на который мне больше всего понравилось отвечать с тех пор, как я присоединился к SO. Извините, что так долго никто не ответил.   -  person GabrielOshiro    schedule 06.10.2015


Ответы (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
ПЕРЕПОЛНЕНИЕ!

person GabrielOshiro    schedule 06.10.2015