Может кто-нибудь объяснить мне, почему переполнение всегда происходит, когда последний и второй последний бит переноса различаются? - PullRequest
1 голос
/ 19 января 2011
overflow = c,n ⊕ c,n−1

Я попробовал это для всех четырех возможных случаев

                            c,n   c,n-1
-7+2      1001+0010         0     0         
7+2       0111+0010         0     1
-7+(-2)   1001+1110         1     0
7+(-2)    0111+1110         1     1 

и, похоже, работает, но кто-то может объяснить или доказать, почему?

Ответы [ 2 ]

2 голосов
/ 20 января 2011

При добавлении двух чисел с n битами результат может иметь n+1 бит.Это означает, что, используя n биты для результата, мы не можем представить их все.

Что такое переполнение?Если мы рассмотрим число со знаком, это будет означать, что мы можем расширить число, добавив знаковый бит (MSB) выше MSB, и они будут равны.Итак, когда это не выполняется (следующий бит после MSB не равен MSB, что-то, что может быть обнаружено до усечения результата до n бит), тогда мы говорим, что это переполнение.

Как ваш пример, мы говорим, что переполнение происходит, когда после добавления двух положительных чисел мы получили отрицательное (или два отрицательных, которые дали положительный результат).

Кроме того, проверьте этот ответ Томаса Порнина, Iкажется, он объяснил это очень хорошо.

0 голосов
/ 19 января 2011

Прошло так много времени, у меня есть только смутное понимание того, что говорит нотация.Я бы предположил, что «c» является флагом переноса, а «n» является отрицательным флагом.Но тогда что такое «n-1»?

В любом случае, я предполагаю, что ваш ответ относится к переполнению, происходящему в любом направлении: от отрицательного числа, превращающегося в положительное, и положительного превращения в отрицательное.

...