2015-09-27 3 views
3

Я вижу, что когда я вычитаю положительное и отрицательное число, используя two's complement Я получаю переполнения. Например, если я вычесть 1 из 2 я получаю:Как происходит переполнение в двух дополнениях?

2 = 0010 
1 = 0001 -> -1 = 1111 
2 + (-1) -> 0010 + 1111 = 10001 

Так вот результат пятый осталось немного 10001 - это его переполнение? Я нашел эти правила для обнаруженных перетков с дополнением до двух:

Если сумма двух положительных чисел дает отрицательный результат, то сумма переполнена. Если сумма двух отрицательных чисел дает положительный результат , сумма переполнена. В противном случае сумма не переполнена.

Может кто-нибудь подумать над этими примерами?

+0

Ваш последний пример является непоследовательным. Значение '-1' задается в четырех битах, но ваш ответ вычисляется в пять бит. Если размер слова - 5 бит, то значение '-1' должно быть' 11111', а не '1111'. В 5-битовом слове '1111' - значение' 15', а не '-1'. Вы рассчитали '2 + 15 = -15'. Кроме того, каков ваш вопрос программирования? (Это еще не вопрос программирования.) –

+0

Извините, я не понимаю. Я преобразовал '-1' в четыре бита, а затем добавил и получил пять бит. Как я должен был поступить иначе? –

+0

Вы добавили два подписанных 4-битных значения и получили 5-битный результат, который недействителен для первоначального расчета 4-битных значений. Это как показать кому-то 1-литровое ведро и сказать им: «Заполните его до 5 мл». Они положили в него 995 мл. У вас есть еще одно ведро с 10 мл воды. Вы выливаете их в 10-литровое ведро и говорите: «Эй, 10-литровое ведро не переполнилось. Этот человек положил неправильное количество воды в 1-литровое ведро, потому что я ожидал, что он переполнится на 5 мл!» –

ответ

4

Начнем с ответа на ваш вопрос с заголовком.

Как происходит переполнение в двух дополнениях?

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

Но вы спрашиваете что-то другое по тел вашего вопроса после вашего примера.

Итак, вот результат имеет пятый левый бит 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.

+0

спасибо, я собираюсь немного прочитать «флаг переноса» и «флаг переполнения» и вернуться с вопросами) –

1

@ ответ GabrielOshiro действительно хорош. Я просто хочу добавить здесь немного логики. При добавлении 2 и -1 вместе здесь,

2 = 0010 
1 = 0001 -> -1 = 1111 
2 + (-1) -> 0010 + 1111 = 10001 

Вы должны отделить значащий бит в отрицательное число от остальных битов, так как в дополнение до двух, что бит приносит отрицательное значение. Так что, если вы сначала добавить все остальное первое:

0010 + 0111(leave out the leftmost 1 for now) = 1001 

После этого, мы можем ясно видеть, что пятый бит в «10001» вызывается путем добавления «1» мы оставили ранее (в четвертом бит) с 1001, что дает перенос в пятом бите. Однако, так как это «1» должно действительно отменяться с помощью 1001, оставьте нас с 0001, мы можем смело игнорировать дополнительный бит в «10001» здесь.

Более глубокое рассуждение будет учитывать, когда мы сможем спокойно проигнорировать этот дополнительный бит, а когда мы не сможем. Как отметил @GabrielOshiro, когда выполнение и перенос в самые значимые разные, мы не можем его игнорировать. При выполнении 2 единицы отрицательных чисел теряются, потому что нет места для хранения дополнительного бита, а в переносе две единицы положительных чисел теряются, поскольку предполагается, что единица единицы положительного числа считается вместо отрицательной единицы. Здесь 1 - (-1) = 2. Поэтому перенос и выполнение будут взаимно компенсировать друг друга. Но когда встречается только одно из них, результат будет неправильным, поэтому у нас есть переполнение.

Смежные вопросы