Вопрос

Я знаю, что BCD - это более интуитивно понятный тип данных, если вы не знакомы с двоичным кодом.Но я не знаю, зачем использовать эту кодировку, ее использование не имеет большого смысла, поскольку ее представление в 4 битах (когда представление больше 9).

Также я думаю, что x86 поддерживает только добавления и подстановки напрямую (вы можете преобразовать их через FPU).

Возможно ли, что это происходит от старых машин или других архитектур?

Спасибо!

Это было полезно?

Решение

Я думаю, что BCD полезен для многих причинах, приведенных выше. Одна вещь, которая очевидна, которая, кажется, была упущена из виду, - это предоставление инструкции по переходу от бинарного до BCD и наоборот. Это может быть очень полезно для преобразования числа ASCII в бинарное значение для арифматики.

Один из плакатов был неправильным в том, что цифры часто хранятся в ASCII, на самом деле много бинарного хранения чисел делается, потому что оно более эффективно. И преобразование ASCII в бинар немного сложно. BCD находится вроде как между ASCII и бинарным, если бы были инструкции BSDToint и IntTOBCD, это сделало бы преобразования таковыми действительно простыми. Все значения ASCII должны быть преобразованы в двоичный файл для арифматики. Таким образом, BCD на самом деле полезен в этом ASCII в бинарное преобразование.

Другие советы

Арифметика BCD полезна для точных десятичных вычислений, что часто является требованием для финансовых приложений, бухгалтерского учета и т. Д. Она также облегчает умение умножение/деление на 10. В наши дни есть лучшие альтернативы.

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

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

Может показаться неправдоподобным, что современный процессор X86 будет использоваться в устройстве с такими видами дисплеев, но x86 возвращается длинная Путь, и Иса поддерживает большую обратную совместимость.

BCD-это пространственно расточительное, это правда, но имеет преимущество в том, что он Формат "фиксированного шага", позволяя легко найти NTH -цифру в определенном числе.

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

BCD существует в современных процессорах x86 с тех пор, как он был в оригинальном процессоре 8086, и все процессоры x86 совместимы с 8086.Операции BCD в x86 уже тогда использовались для поддержки бизнес-приложений.Поддержка BCD в самом процессоре на самом деле больше не используется.

Обратите внимание, что BCD - это точное представление десятичных чисел, а не чисел с плавающей запятой, и что аппаратная реализация BCD намного проще, чем реализация чисел с плавающей запятой.Такого рода вещи имели большее значение в те времена, когда в процессорах было менее миллиона транзисторов, работающих на частоте в несколько мегагерц.

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

Кстати, набор команд 8086 - единственный, который я видел с инструкциями для "Настройки ASCII для деления" и "Настройки ASCII для умножения", одна из которых умножает байт на десять, а другая - на десять.Любопытно, что значение "0A" является частью машинных инструкций, и замена другого числа приведет к тому, что эти инструкции будут умножаться или делиться на другие величины, но инструкции не документированы как универсальные инструкции умножения / деления на константу.Интересно, почему эта функция не была задокументирована, учитывая, что она могла бы быть полезной?

Также интересно отметить разнообразие подходов, используемых процессорами для сложения или вычитания упакованных BCD.Многие выполняют двоичное сложение, но используют флаг, чтобы отслеживать, произошел ли перенос с бита 3 на бит 4 во время сложения;затем они могут ожидать, что код очистит результат (напримерPIC), укажите код операции для очистки сложения, но не для вычитания, укажите один код операции для очистки сложения и другой для вычитания (напримерx86), или используйте флаг, чтобы отслеживать, была ли последняя операция сложением или вычитанием, и используйте один и тот же код операции для очистки обоих (напримерZ80).Некоторые используют отдельные коды операций для арифметики BCD (например68000), а некоторые используют флаг, указывающий, следует ли использовать операции сложения / вычитания в двоичном формате или BCD (например6502 производные).Интересно, что оригинальный 6502 выполняет BCD-математику с той же скоростью, что и двоичная математика, но производные от него CMOS требуют дополнительного цикла для операций BCD.

Я уверен, что статья Wiki, связанная с ранее, идет более подробно, но я использовал BCD на программировании мэйнфрейма IBM (в PL/I). BCD не только гарантировал, что вы могли бы посмотреть на конкретные области байта, чтобы найти отдельную цифру - что иногда полезно - но также позволило аппаратному обеспечению применять простые правила для расчета необходимой точности и масштаба для добавления или умножения двух чисел вместе.

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

Когда я учился в колледже более 30 лет назад, мне сказали, что причины, по которым BCD (Comp-3 в Cobol) были хорошим форматом.

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

BCD является реликвией, и его следует оставить в прошлом, где он принадлежит.

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

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

При этом BCD все еще иногда полезен.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top