Почему для чисел со знаком предпочитают два дополнения над знаком и величиной? - PullRequest
186 голосов
/ 14 июля 2009

Мне просто любопытно, есть ли причина, по которой для представления -1 в двоичном виде используется дополнение к двум: переворачивание битов и добавление 1?

-1 представлен 11111111 (дополнение к двум), а не (для меня более интуитивным) 10000001, который является двоичным 1 с первым битом в качестве отрицательного флага.

Отказ от ответственности: я не полагаюсь на двоичную арифметику для моей работы!

Ответы [ 18 ]

0 голосов
/ 05 сентября 2018

потому что производители процессоров ленивы!

0 голосов
/ 11 июля 2016

Основным преимуществом представления с двумя дополнениями, которое еще не было упомянуто здесь, является то, что младшие биты суммы, разности или произведения с двумя дополнениями зависят только от соответствующих битов операнды. Причина того, что 8-битное значение со знаком для -1 равно 11111111, заключается в том, что вычитание любого целого числа, чьи младшие 8 битов равны 00000001, из любого другого целого числа, младшие 8 битов которого 0000000, даст целое число чьи младшие 8 битов 11111111. Математически, значение -1 будет бесконечной строкой из 1, но все значения в диапазоне определенного целочисленного типа будут либо всеми 1, либо всеми 0 после определенной точки, поэтому компьютерам удобно «расширять знак» старший значащий бит числа, как если бы он представлял собой бесконечное число единиц или нулей.

Two's -plement - это почти единственное представление числа со знаком, которое хорошо работает при работе с типами, размер которых превышает натуральный размер слова двоичной машины, поскольку при выполнении сложения или вычитания код может извлекать наименьший фрагмент каждого операнда, вычисляя младший фрагмент результата и сохраните его, затем загрузите следующий фрагмент каждого операнда, вычислите следующий фрагмент результата, сохраните его и т. д. Таким образом, даже процессор, которому требуются все сложения и вычитания для прохождения одного -битный регистр может обрабатывать 32-битные числа со знаком достаточно эффективно (медленнее, чем с 32-битным регистром, конечно, но все еще работоспособно).

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

0 голосов
/ 21 июля 2016

Один удовлетворительный ответ о том, почему Дополнение Two2 используется для представления отрицательных чисел, а не система Дополнения One, заключается в том, что Система дополнения Two решает проблему множественных представлений 0 и необходимость разноски , которые существуют в системе дополнения One для представления отрицательных чисел.

Для получения дополнительной информации посетите https://en.wikipedia.org/wiki/Signed_number_representations

Для посещения в конце https://en.wikipedia.org/wiki/End-around_carry

0 голосов
/ 14 июля 2009

Дополнение Two используется, потому что его проще реализовать в схемах, а также не допускается отрицательный ноль.

Если есть x битов, два дополнения будут в диапазоне от + (2 ^ x / 2 + 1) до - (2 ^ x / 2). Его дополнение будет работать от + (2 ^ x / 2) до - (2 ^ x / 2), но разрешит отрицательный ноль (0000 равно 1000 в системе дополнения 4 бита 1).

0 голосов
/ 14 июля 2009

Что ж, ваше намерение не в том, чтобы полностью изменить все биты вашего двоичного числа. Фактически вычитать каждую цифру из 1. Это просто удачное совпадение, что вычитание 1 из 1 приводит к 0, а вычитание 0 из 1 - 1. Таким образом, переворачивание битов эффективно выполняет это вычитание.

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

Это объясняет первый шаг в вычислении дополнения двоих. Теперь давайте включим второй шаг - добавление 1 - также на рисунке.

Добавьте 1 к приведенному выше двоичному уравнению:

11111111 - 10110001 + 1

Что вы получаете? Это:

100000000 - 10110001

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

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

0 голосов
/ 01 августа 2013

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

0 голосов
/ 17 ноября 2012

Стоит отметить, что на некоторых ранних машинах добавления, до дней цифровых компьютеров, вычитание выполнялось, когда оператор вводил значения, используя разные цветные условные обозначения для каждой клавиши (так, чтобы каждая клавиша вводила девять минус число, которое будет вычтено), и нажатие на специальную кнопку приведет к переносу в расчет. Таким образом, на шестизначном компьютере, чтобы вычесть 1234 из значения, оператор нажимал бы на клавиши, которые обычно обозначали бы «998,765», и нажимал кнопку, чтобы добавить это значение плюс один к текущему вычислению. Арифметика дополнения двух - это просто двоичный эквивалент этой ранней арифметики «дополнения десяти».

0 голосов
/ 01 марта 2012

Мы выполняем только операции сложения для сложения и вычитания.Мы добавляем второй операнд к первому операнду для добавления.Для вычитания мы добавляем дополнение 2 второго операнда к первому операнду.

При представлении дополнения 2 нам не нужны отдельные цифровые компоненты для вычитания - используются только сумматоры и дополнители.

...