2's дополнительный пример, почему бы не нести?

1) Да.

2) Изучите математические вопросы, которые звучат интересно. Купить / читать книги, которые дают вам необходимую информацию. Повторить.

8
задан SilentGhost 2 November 2009 в 22:33
поделиться

10 ответов

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

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

00000100
11111101
--------
00000001

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

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


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

10
ответ дан 5 December 2019 в 07:11
поделиться

Перенос - это не то же самое, что переполнение

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

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

4
ответ дан 5 December 2019 в 07:11
поделиться

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

 ...000100
+...111101
----------
....000001
3
ответ дан 5 December 2019 в 07:11
поделиться

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

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

2
ответ дан 5 December 2019 в 07:11
поделиться

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

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

 000100
 111101
 ------
1000001

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

1
ответ дан 5 December 2019 в 07:11
поделиться

Рассмотрим 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
ответ дан 5 December 2019 в 07:11
поделиться

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

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

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

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

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

1100
 0100
 1101
 ----
 0001
2
ответ дан 5 December 2019 в 07:11
поделиться

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

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

-1
ответ дан 5 December 2019 в 07:11
поделиться

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

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

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

Один простой способ представить это как «знак не меняется».

1
ответ дан 5 December 2019 в 07:11
поделиться

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

0
ответ дан 5 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: