Начнем с ответа на ваш вопрос с заголовком.
Как происходит переполнение в двух дополнениях?
правило Переполнение: Если два числа с одинаковым знаком (положительные или отрицательные) и добавляются, то происходит переполнение, если и только если результат имеет противоположный знак.
Но вы спрашиваете что-то другое по тел вашего вопроса после вашего примера.
Итак, вот результат имеет пятый левый бит 10001
- это переполнение?
Нет! здесь нет переполнения. Этот пятый бит - это перенос/заимствование. Носите, если вы говорите о добавлении. Заимствуйте, если вы говорите об вычитании.
Переполнение происходит, когда число, которое вы пытаетесь представить, выходит за пределы диапазона чисел, которые могут быть представлены. В вашем примере вы используете 4-битные два дополнения, это означает, что вы можете представить любое число в диапазоне -8
(1000
) до +7
(0111
). Результатом вычитания 2-1
является +1
, число, которое находится в пределах диапазона представления.
Когда мы добавляем отрицательный и положительный операнд, результат всегда будет в диапазоне представления. Переполнение происходит, когда мы добавляем два числа с одинаковым знаком (оба положительные или оба отрицательные), а результат имеет противоположный знак.
Большая часть недоразумений, связанных с выполнением и переполнением, происходит из-за того, что мы используем выполнение в качестве одного из параметров для создания флага переполнения. Они сильно связаны, но это не одно и то же.
При добавлении чисел в дополнение к двум, если выполнение и перенос в самый старший бит (бит знака) различны, что означает переполнение.
Давайте посмотрим, два отрицательных операнды с положительным результатом:
-8 + (-1) = -9
1000 (carry)
1000 (-8)
+ 1111 (-1)
------
0111 (+7) OVERFLOW!
перевозимый-аут 1 и перенос на знаковый бит (MSB) равен 0.
А теперь пример из двух положительных операндов с отрицательным результатом.
+7 + 1 = +8
0111 (carry)
0111 (+7)
+ 0001 (+1)
------
1000 (-8) OVERFLOW!
Переходящий из 0 и перенос на знаковый бит (MSB) равен 1.
Ваш последний пример является непоследовательным. Значение '-1' задается в четырех битах, но ваш ответ вычисляется в пять бит. Если размер слова - 5 бит, то значение '-1' должно быть' 11111', а не '1111'. В 5-битовом слове '1111' - значение' 15', а не '-1'. Вы рассчитали '2 + 15 = -15'. Кроме того, каков ваш вопрос программирования? (Это еще не вопрос программирования.) –
Извините, я не понимаю. Я преобразовал '-1' в четыре бита, а затем добавил и получил пять бит. Как я должен был поступить иначе? –
Вы добавили два подписанных 4-битных значения и получили 5-битный результат, который недействителен для первоначального расчета 4-битных значений. Это как показать кому-то 1-литровое ведро и сказать им: «Заполните его до 5 мл». Они положили в него 995 мл. У вас есть еще одно ведро с 10 мл воды. Вы выливаете их в 10-литровое ведро и говорите: «Эй, 10-литровое ведро не переполнилось. Этот человек положил неправильное количество воды в 1-литровое ведро, потому что я ожидал, что он переполнится на 5 мл!» –