Для арифметической операции компьютер может использовать двоичный код или прямой двоичный эквивалент числа или оба? - PullRequest
0 голосов
/ 08 февраля 2019

Например, BCD-код десятичного числа 395 - 001110010101, а прямое двоичное преобразование - 110001011, который однозначный компьютер может использовать для арифметических операций

1 Ответ

0 голосов
/ 08 февраля 2019

Большинство процессоров имеют эффективную аппаратную поддержку только для двоичных чисел (и обычно только для размеров степени 2 в современных процессорах, так что вы хотите, чтобы это было не менее 16 бит).

Вы можете внедрить упакованную BCD (1 цифра на клев), используя операции сдвига / маски и сравнения, чтобы проверить, становится ли цифра >9, и вручную переносить переход к следующей цифре (старший кусочек этого байта или следующего байта).т. е. как часть сложения / вычитания, аналогично двоичному сложению / подсчету расширенной точности с выносом.

У некоторых процессоров даже есть флаг для выноса из низкого куска.например, АФ x86.В 16- и 32-битном режиме x86 даже имеет (медленные) инструкции для корректировки результата после обычного двоичного сложения вычитания байта, содержащего две упакованные цифры BCD.( DAA / DAS и другие инструкции для неупакованного BCD (1 цифра на байт), все из которых удалены в 64-битном режиме и в основном медленное микрокодирование на текущих процессорах в 16 и 32-битном режимах).

Некоторые другие ISA имеют аналогичную поддержку для помощи в вычислении упакованных BCD, например, флаг переноса nibble-переноса.

Распакованный BCD (1 цифра на байт) проще реализовать, поскольку вы можете сравнить целый байт для>9 без предварительного извлечения младших 4 битов, чтобы сгенерировать сигнал переноса для следующей цифры.(Старшие 4 бита можно проверить на >= (10<<4) без распаковки.)

Но любая нормальная архитектура с инструкциями AND / OR и сдвигом вправо / влево позволяет довольно легко извлечь клев и выполнить команду>9 и настройте + нести проверку полностью вручную. Если вы выполняете несколько операций, возможно, лучше было бы временно распаковать в байты и перепаковать в конце, или даже преобразовать в двоичный файл.

Нообратное преобразование из двоичного в BCD дорого: вам нужно разделить на 10 для каждой ненулевой цифры результата, получая по одной цифре за раз.Это требует умножения и сдвига, что медленно на младших процессорах. Почему GCC использует умножение на странное число при реализации целочисленного деления? .Если у вас есть больше двоичных разрядов, которые вы можете подать на одно умножение или деление, то это значительно дороже за цифру, пока число не станет достаточно маленьким.

...