Является ли это арифметическим вычислением переполнения?

Поэтому, когда я читаю книгу, в ней говорится, что переполнение не может происходить при добавлении разных знаков и вычитании одного и того же знака. Но у меня есть вопрос, когда я это делаю: 185 - 122 Я преобразовал двоичный код 122 в 2-е дополнение и сделал сложение, которое имеет разные знаки: 185+(-122), и когда я складываю их вместе, я получил переполнение знакового бита для 100111111. Но если я отрежу старший бит слева, это правильный ответ. Это перелив?


person Rozen    schedule 23.02.2014    source источник


Ответы (1)


Нет, это не переполнение - переполнение, возникающее в результате добавления 2 1's в MSB, должно быть просто отброшено. Из Википедии

Чтобы получить дополнение до двух двоичного числа, биты инвертируются или «переворачиваются» с помощью побитовой операции НЕ; затем значение 1 добавляется к результирующему значению, игнорируя переполнение, возникающее при взятии дополнения до двух, равного 0.

Итак, в вашем примере

185 10111001
122 01111010 -

Принимая дополнение 2 к 122 (дополнение до единицы +1)

01111010 => 10000110

Добавление:

10111001 185
10000110 +(-122)
--------
00111111 (63)

=63

overflow игнорируется.

Однако существуют правила обнаружения переполнения после выполнения дополнения 2:

  • Если сумма двух положительных чисел дает отрицательный результат
  • Если сумма двух отрицательных чисел дает положительный результат
person StuartLC    schedule 23.02.2014
comment
@Rozen - здесь есть несколько дополнительных ответов stackoverflow.com/q/6853524/314291 о том, почему ЦП/АЛУ используют дополнение 2 внутри. Очевидно, как конечные пользователи, мы просто, например. используйте SUB для вычитания на Intel) - person StuartLC; 23.02.2014