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

11

В некоторых устройствах АЦП / ЦАП есть опции для вывода / ввода данных в форме дополнения 2.

Каковы преимущества представления цифровых данных в форме дополнения двух, когда вы можете просто иметь прямой двоичный код и сэкономить время преобразования?

rahulb
источник
4
Комплимент Two - это прямой двоичный код ...
Mooing Duck
«Алгебра запускается на машине (вселенной), которая дополняет два» - HAKMEM 154 ( inwap.com/pdp10/hbaker/hakmem/hacks.html )
ChrisInEdmonton
2
Что такое 5 в двух дополнениях? 101. Что такое 5 в прямом двоичном коде? 101. Что такое -5 в дополнение к двум? 1 ... 11111011. Что такое -5 в прямом двоичном коде?
Э-э-э
Похоже на редкий особый случай иметь АЦП с отрицательным выходом? Что это вообще значит, что измеряемое напряжение ниже , чем напряжение низкого отсчета? И как бы вы построили такой АЦП? Последовательное приближение с крышками, которые имеют отрицательную нагрузку ...?
Лундин
Обратите внимание, что есть два разных слова: комплимент и комплимент . Предметом здесь является комплимент для двоих , даже если эти двое очень вежливы и часто говорят о вас хорошие вещи.
Пит Беккер,

Ответы:

11

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

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

многочлен
источник
1
Перебрасывание битов, затем добавление 1 к отрицанию, нет ??
Скотт Сейдман
2
@ ScottSeidman Да, извините, я забыл об этом. Отредактировано, чтобы исправить :)
Полином
1
На самом деле, для максимальной разборчивости, в зависимости от процессора, это может быть один цикл, чтобы взять x = x * -1, или x = 0 - x , по крайней мере, по крайней мере, два цикла для x = ~ x + 1
markt
@markt Да, но если вы используете только минимальное устройство (т.е. не полноценный процессор), то имеет смысл сократить сложность кремния до минимума.
Полином
5
+1 Кроме того, у дополнения Two есть только одно значение для 0. Другие (например, дополнение или знаковый бит) заканчивают тем, что имеют два
sbell
5

АЦП может преобразовывать данные (скажем, входные напряжения от 0 до 5 В), и вам необходимо, чтобы эти данные были без знака (0 В = 0, 5 В = макс. Код) или со знаком (2,5 В = 0, 0 В = макс. -Ve, 5 В = макс. анолит).

В дополнение к тому, что дополнение 2 является самым распространенным компьютерным представлением для подписанных данных, преобразование между двумя описанными выше форматами является совершенно тривиальным: просто инвертируйте MSB!

Это невероятно дешево добавить к внутренней логике АЦП и дает АЦП еще одну точку продаж в таблице ...

Брайан Драммонд
источник
Просто добавьте MSB-переключатель между двоичным дополнением и двоичным смещением в качестве комментария ниже
Скотт Сейдман
3

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

Скотт Сейдман
источник
1

В этом вопросе, по-видимому, подразумевается, что для АЦП требуется больше времени, чтобы вернуть значение в форме дополнения 2, чем в прямом двоичном формате. Хотя это может иметь место в какой-то конкретной реализации АЦП, в целом это не так (например, микроконтроллеры серии MSP430 имеют встроенную в чип периферийную АЦП, которая сообщает значение в прямом двоичном коде или дополнении 2, но это занимает одинаковое количество циклов в обоих случаях).

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

В прямом двоичном режиме АЦП дает вам число, которое представляет собой соотношение между величиной измеренной аналоговой величины (практически всегда напряжением) и эталонной величиной полной шкалы. Например, 10-разрядный АЦП может возвращать значения от 0 до 1023 (включительно). Если измерить напряжение (скажем, 1,25 вольта), которая составляет половину от опорного напряжения АЦП (скажем, 2,50 вольта), двоичный код чтения будет составлять половину от максимального значения вы можете прочитать - так, 512, или около того, с учетом округления и нелинейностей в АЦП.

Например, предположим, у вас есть датчик, который сообщает количество ракетного топлива в баке. 0 В означает, что бак пуст, а 2,5 В означает, что он заполнен. Таким образом, вы просто подключаете преобразователь к вашему АЦП, и все!

Но обратите внимание, что в приведенном выше параграфе нет способа измерить отрицательные напряжения. Что если бы мы хотели измерить поток ракетного топлива в бак и из него (и для этого у нас был датчик)? АЦП не может измерять отрицательные числа, поэтому у нас проблема. Однако есть простой способ подделать его, используя режим дополнения 2: В этом случае выходной сигнал датчика смещается так, что нулевая точка находится посередине между двумя опорными напряжениями АЦП. Другими словами, положительные потоки представлены напряжениями от 1,25 В до 2,50 В, а отрицательные потоки представлены напряжениями от 1,25 В до 0 В, поэтому потоки в бак будут давать коды АЦП от 512 до 1023, а потоки из блока питания будут давать коды от 511 до 0 (в прямом двоичном формате).

Теперь это ужасно неудобно. Мы должны вычесть 512 из каждого измерения, прежде чем что-либо делать с ним, что дает числа в диапазоне от -512 до +511. Суть режима дополнения 2 в том, что он делает это для вас!

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

ник г
источник
1

Используется система комплемента двух, потому что она проистекает из того, как просто работает аппаратное обеспечение. Например, одометр автомобиля, который вы обнулили. Затем включите передачу задним ходом и двигайтесь назад на 1 милю (пожалуйста, не делайте этого на самом деле). Ваш одометр (если он механический) будет катиться с 0000 до 9999. Система дополнения двух ведет себя аналогично.

введите описание изображения здесь


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

И да, одометр моего Nissan работает таким образом.

PKP
источник
Ваш ответ о переполнении (и недостатке), но, поскольку одометр не отображает отрицательные числа, он не
учитывает
@marcelm, На самом деле, пример одометра делает объяснить двойки дополнения. Просто PkP не пошел достаточно далеко с объяснением. Если шестизначный одометр показывает ноль, и вы едете задним ходом в течение одной мили, то вы ожидаете, что он будет читать -1. Вместо этого он читается как 999999. Это потому, что 999999 - это шестизначное, десятки дополняющее представление -1.
Соломон Медленный
@jameslarge Нет, все равно нет. В ответе нет ничего, что действительно касалось бы дополнения двоих. Или дополнение, или величина знака, или любое представление числа со знаком.
marcelm
@marcelm Да, есть: основная идея системы дополнения двух: этот ноль минус один равен максимально представимому целому числу без знака. Это идея системы дополнения двух. Никакое другое подписанное представление числа не предлагает это (насколько мне известно). И пример одометра показывает, насколько естественно это поведенческое свойство проистекает из простоты инженерии; в случае одометра: от машиностроения. Как в механическом, так и в электронном мире это (система дополнения двух) - самый простой способ заставить это работать.
PkP
0

Другие уже ответили, почему двоичный код с комплиментами удобен для компьютерного оборудования. Тем не менее, вы, похоже, спрашиваете, почему A / D будет выводить комплимент для двух, а не «прямой двоичный код» (что, по вашему мнению, действительно означает).

Большинство A / D выводят простое двоичное значение без знака в диапазоне от 0 до 2 N -1, где N - количество битов, в которые A / D преобразуется. Обратите внимание, что это также может считаться двойной комплиментарной нотацией, просто значения никогда не бывают отрицательными. Если вы имеете дело только с положительными числами, то большинство двоичных представлений одинаковы. Это включает в себя два комплимента и знак величины.

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

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

В противном случае вы все равно будете применять некоторое масштабирование и смещение к показаниям АЦП, чтобы получить их в любых единицах измерения, которые вы используете для внутренних значений. Здесь также нет недостатка в значениях без знака, поступающих непосредственно из A / D. Фактически я обычно применяю некоторую фильтрацию нижних частот к необработанным значениям перед любым масштабированием и смещением. Знание этих значений никогда не будет отрицательным, что немного упрощает вычисления. Выполнение масштабирования беззнаковых значений также иногда упрощает задачу.

Я не могу вспомнить ни одного случая в более чем 100 проектах микроконтроллеров, где я использовал A / D в любом формате, кроме как без знака.

Итак, чтобы ответить на вопрос о том, какие преимущества дает аналого-цифровой вывод «комплимента», есть два ответа:

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

  2. Преимущества очень незначительны. Внутри микроконтроллера их практически не существует.

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

Олин Латроп
источник
-1

О каком «прямом двоичном коде» ты говоришь? Я предполагаю, что вы имеете в виду наличие знака «1» для отрицательного и «0» для положительного (или наоборот ). Это имеет еще два недостатка по сравнению с дополнением к двум, которые еще не были упомянуты: один в значительной степени не имеет значения в наши дни, а другой важный.

В значительной степени не имеет значения, что вы можете представить на одно меньшее число - то есть 255 чисел в 8 битах. Это довольно неуместно, когда у вас есть 32 или 64 бита, но важно, когда у вас было всего 4 или 6 бит для работы.

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

Джек Эйдли
источник
Я думаю, что вы не в курсе. Вы говорите о представлении величины знака, когда ОП довольно ясно говорил о двоичном представлении без знака.
Джо Хасс
1
Если вы говорите о неподписанном представлении, то в дополнении Two нет никакого преимущества. Это просто немного впустую.
Джек Эйдли