Используется ли когда-либо «фальшивое вычитание» в реальном мире? - PullRequest
5 голосов
/ 16 июня 2011

Я беру урок по компьютерным системам в качестве предварительного требования для своих магистров и наткнулся на то, что мне показалось увлекательным и трудным для понимания на практике, и это «фальшивое вычитание» и тот факт, что нет необходимости быть инструкцией по вычитанию.

Что-то вроде:

х - у

Может быть записано как:

x + (~ y + 1)

Так вот, это все хорошо, но кажется, что это слишком сложно для простого вычитания, особенно когда вы можете просто поставить "x - y". Существуют ли ситуации, когда это необходимо сделать, или это просто то, что МОЖЕТ быть сделано, но это не так.

Ответы [ 6 ]

6 голосов
/ 16 июня 2011

Это часто, как это делается на аппаратном уровне (то есть внутри АЛУ).

На уровне программного обеспечения это, как правило, бесполезно, поскольку оно никогда не может быть более эффективным, чем прямое вычитание (если у вас нет действительно причудливой комбинации компилятор / платформа).

2 голосов
/ 16 июня 2011

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

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

2 голосов
/ 16 июня 2011

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

1 голос
/ 16 июня 2011

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

Однако именно так процессоры выполняют вычитание. Могу поспорить, что вы рассматривали этот код как пример того, что делает аппаратное обеспечение, поскольку легче увидеть, как x + (~y + 1) станет логической схемой.

Итак ... нет, вы не будете использовать этот код в реальном мире, но эта операция выполняется в вашем процессоре много раз.

0 голосов
/ 16 июня 2011

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

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

0 голосов
/ 16 июня 2011

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

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