Поэтому, когда я читаю книгу, в ней говорится, что переполнение не может происходить при добавлении разных знаков и вычитании одного и того же знака. Но у меня есть вопрос, когда я это делаю: 185 - 122 Я преобразовал двоичный код 122 в 2-е дополнение и сделал сложение, которое имеет разные знаки: 185+(-122), и когда я складываю их вместе, я получил переполнение знакового бита для 100111111. Но если я отрежу старший бит слева, это правильный ответ. Это перелив?
Является ли это арифметическим вычислением переполнения?
Ответы (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
@Rozen - здесь есть несколько дополнительных ответов stackoverflow.com/q/6853524/314291 о том, почему ЦП/АЛУ используют дополнение 2 внутри. Очевидно, как конечные пользователи, мы просто, например. используйте
SUB
для вычитания на Intel)
- person StuartLC; 23.02.2014