2 дополнения пример, почему бы не нести? - PullRequest
8 голосов
/ 02 ноября 2009

Я смотрю несколько замечательных лекций Дэвида Малана ( здесь ), которые идут через двоичный файл. Он говорил о подписанном / неподписанном, 1 комплименте и 2 дополняющих представлениях. Было сделано добавление 4 + (-3), которое выстроилось так:

0100
1101 (flip 0011 to 1100, then add "1" to the end)
----
0001

Но он махнул своими волшебными руками и выбросил последний керри. Я немного занимался исследованиями в Википедии, но не понял, может кто-нибудь объяснить мне, почему этот конкретный перенос (в столбцах 8–16) был сброшен, но он оставил тот, что был до него?

Спасибо!

Ответы [ 10 ]

10 голосов
/ 03 ноября 2009

Последний перенос был отброшен, потому что он не помещается в целевом пространстве. Это будет пятый бит.

Если бы он выполнил то же самое дополнение, но, например, с 8-битной памятью, это выглядело бы так:

00000100
11111101
--------
00000001

В этой ситуации мы также застряли бы с «неиспользованным» переносом.

Мы должны относиться к переноскам таким образом, чтобы правильно сложить их с комплиментом двоих, но это все хорошо, потому что это самый простой способ обработки переносок, когда у вас ограниченное хранилище. В любом случае, мы получаем правильный результат, верно:)


x86-процессоры хранят такой дополнительный перенос в флаге переноса (CF), который можно проверить с помощью определенных инструкций.

4 голосов
/ 03 ноября 2009

перенос не совпадает с переполнением

В примере у вас есть вынос MSB. По определению, этот перенос заканчивается на полу. (Если бы было что-то для этого, то это не было бы из MSB.)

Но добавление двух чисел с разными знаками не может быть переполнено. Переполнение может произойти только тогда, когда два числа с одним и тем же знаком дают результат с другим знаком.

3 голосов
/ 03 ноября 2009

Если вы расширите левую сторону, добавив больше позиций цифр, вы увидите, что перенос переносится на бесконечное число позиций битов влево, так что вы никогда не получите окончательный перенос 1. Поэтому Ответ положительный.

 ...000100
+...111101
----------
....000001
2 голосов
/ 03 ноября 2009

В этом вся прелесть ... Ваш результат будет того же размера, что и добавляемые вами термины. Так что пятый бит выбрасывается

В дополнении 2 вы используете бит переноса, чтобы сигнализировать, было ли переполнение в последней операции.

Вы должны посмотреть на LAST два бита переноса, чтобы увидеть, не было ли переполнения. В вашем примере последние два бита переноса были 11, означая, что переполнения не было.

Если последние два бита переноса равны 11 или 00, переполнение не произошло. Если последние два бита переноса равны 10 или 01, то произошло переполнение. Вот почему он иногда заботился о биту для переноски, а иногда игнорировал его.

Первый ряд ниже - это строка переноса. Крайние левые биты в этом ряду используются для определения переполнения.

1100
 0100
 1101
 ----
 0001
2 голосов
/ 03 ноября 2009

В какой-то момент вы должны установить количество бит для представления чисел. Он выбрал 4 бита. Любой перенос в 5-й бит теряется. Но это нормально, потому что он решил представить число всего в 4 битах.

Если бы он решил использовать 5 бит для представления чисел, он бы получил тот же результат.

1 голос
/ 03 ноября 2009

При выполнении добавления дополнения к 2, единственный раз, когда перенос указывает на проблему, это когда возникает условие переполнения - это не может произойти, если у двух операндов есть другой знак.

Если они имеют один и тот же знак, то условие переполнения - это когда бит знака меняется с 2 операндов, т. Е. Происходит перенос в самый старший бит.

Если я помню свое обучение компьютерной архитектуре, это часто обнаруживается на аппаратном уровне с помощью флага, который устанавливается, когда перенос в самый старший бит отличается , чем перенос самого старшего бита. Что не так в вашем примере (есть перенос в msb, а также из msb).

Один простой способ думать об этом - как «знак не меняется». Если перенос в msb отличается от переноса, то знак неправильно изменился.

1 голос
/ 03 ноября 2009

Рассмотрим 25 + 15:

5 + 5 = 10, мы сохраняем 0 и пропускаем 1 в столбец десятков. Тогда это 2 + 1 (+ 1) = 4. Следовательно, результат 40:)

То же самое и с двоичными файлами. 0 + 1 = 1, 0 + 0 = 0, 1 + 1 = 10 => отправить 1 столбец 8, 0 + 1 (+ 1) = 10 => отправить 1 в следующий столбец - Вот переполнение и почему мы просто выбрасываем 1

Вот почему дополнение 2 так здорово. Он позволяет вам добавлять / вычитать так же, как вы делаете с base-10, потому что вы (ab) используете тот факт, что бит знака является MSB, который будет каскадно выполнять операции вплоть до переполнений, когда это необходимо.

Надеюсь, я понял себя. Довольно сложно объяснить это, когда английский не родной язык:)

1 голос
/ 03 ноября 2009

Похоже, вы используете только 4 бита, поэтому столбца 16 нет.

Если бы вы использовали более 4 битов, представление -3 было бы другим, и перенос математики все равно был бы отброшен до конца. Например, с 6 битами у вас будет:

 000100
 111101
 ------
1000001

и поскольку перенос находится за пределами диапазона битов вашего представления, он исчез, и у вас есть только 000001

0 голосов
/ 03 ноября 2009

Потому что вы говорите о 4-битных представлениях. Это непривычно по сравнению с реальной машиной, но если принять за должное то, что на мгновение компьютер имеет 4 бита в каждом байте, то у нас есть следующие свойства: байт оборачивается в 15–15. Все, что находится за пределами этого диапазона, не может быть сохранено. Кроме того, что бы вы сделали с дополнительным 5-м битом, кроме знака?

Теперь, учитывая это, мы можем видеть из повседневной математики, что 4 + (-3) = 1, это именно то, что вы получили.

0 голосов
/ 03 ноября 2009

Керри был сброшен, потому что с ним ничего нельзя было сделать. Если это важно для результата, это означает, что операция вышла за пределы диапазона значений, которые могут быть сохранены в результате. В ассемблере обычно есть инструкция, которая может проверять перенос после конца результата, и вы можете явно с этим справиться - например, перенести его в следующую более высокую часть значения с множественной точностью.

...