Вы получили ошибку в своих вычислениях.
Вычитание двух чисел в дополнении к двум - это не то, как вы изобразили его на втором изображении.
На рисунке показано сложение, а не вычитание, ив вычитании вы используете заимствование , а не перенос .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1.первые два бита заимствования отличаются, поэтому 1 XOR 0 = 1
приводит к переполнению.
См. Википедия для получения дополнительной информации.
Добавление
Чтобы пояснить, почему ваше предположение о том, что переполнение не произошло, когда оно имеет место, в ваших вычислениях сложения на втором изображении неверно:
00000000 (carry)
00000000 (0)
+ 10000000 (-128)
----------
10000000 (-128)
, поскольку 0 + -128 = -128
и 0 XOR 0 = 0
, следовательно,без переполнения.
В этом случае сложение не пересекает границу -128 and 127
.
Давайте рассмотрим представление дополнения до двух только 4-битами.
-128
будет представлен как -8
.
Если вы идете сюдаОт m 0
до -8
против часовой стрелки (для вычитания) вы увидите, что граница (обозначенная красной линией) не пересечена, следовательно, нет переполнения.
Если мы возьмем ваш первый пример, которыйбудет 7 + 1
и будет идти по часовой стрелке (сложение) из 7
, в результате вы получите -8
, и вы пересекли границу, а значит переполнились.
То, что вы думали, что вы сделали на втором изображении, было0 + 128
.Вы пошли от 0
до -128
по часовой стрелке (дополнение).Это перешагнуло границу, но, поскольку 128
не может быть представлено в 8-битном двоичном дополнении, предположение и расчет были неверными.
Вы предположили, что 0 + 128
было таким же, как 0 - (-128)
, что явно некак сказано выше 128
не может быть представлено в дополнении 8-битных двоих.