2.Двоично-десятичное кодирование - Разработка программ преобразования форматов двоичных данных и сортировок

Компромиссная система, для удобства восприятия данных человеком и корректной работы компьютера, двоично-десятичная запись чисел.

Принцип построения этой системы достаточно прост: каждая десятичная цифра преобразуется прямо в свой десятичный эквивалент из 4 бит, например:

369110=0011 0110 1001 0001DEC:

Десятичное число3691

Двоично-десятичное число0011011010010001

Преобразуем двоично-десятичное число 1000 0000 0111 0010 в его десятичный эквивалент. Каждая группа из 4 бит преобразуется в ее десятичный эквивалент. Получим 1000 0000 0111 0010DЕС = 807210:

Двоично-десятичное число1000000001110010

Десятичное число8072

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

Форматы представления десятичных чисел

В настоящее время распространены два формата представления десятичных чисел в микропроцессорах - упакованный двоично-десятичный код (BCD-Binary-Coded Decimal) и неупакованный десятичный код.

Упакованный BCD-код - это такое представление десятичного числа, когда каждая десятичная цифра представляется 4-х битным двоичным позиционным кодом 8-4-2-1. При этом байт содержит две десятичные цифры. Младшая десятичная цифра занимает правую тетраду (биты 3 : 0), старшая - левую тетраду (биты 7 :4).

Многоразрядные BCD-числа занимают несколько смежных байт. Если число является знаковым, то для представления знака в BCD-формате отводится старшая тетрада старшего байта. Для кодирования знака можно использовать шесть двоичных кодовых комбинаций, которые не используются для представления десятичных цифр. Это коды 1010-1111 (A-F в шестнадцатеричном представлении). Обычно для кодирования знака плюс применяют код 1100 (C), а для знака минус - 1101 (D). На рисунке показано BCD-представление десятичного числа "-12345":

1

1

0

1

0

0

0

1

"-"

"1"

0

0

1

0

0

0

1

1

"2"

"3"

0

1

0

0

0

1

0

1

"4"

"5"

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

Преимущества

Упрощен вывод чисел на Индикацию -- вместо последовательного деления на 10 требуется просто вывести на индикацию каждый полубайт. Аналогично, проще ввод данных с цифровой клавиатуры.

Для дробных чисел (как с фиксированной, так и с плавающей запятой) при переводе в человекочитаемый десятичный формат и наоборот не теряется точность.

Упрощены умножение и деление на 10, а также округление.

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

Недостатки

    - Усложнены арифметические операции. - Требует больше памяти. - В двоично-десятичном коде 8421-BCD существуют запрещенные комбинации битов:

Запрещенные в 8421-BCD битовые комбинации

1010

1011

1100

1101

1110

1111

Запрещенные комбинации возникают обычно в результате операций сложения, так как в 8421-BCD используются только 10 возможных комбинаций 4-х битового поля вместо 16. Поэтому, при сложении и вычитании чисел формата 8421-BCD действуют следующие правила:

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

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

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

Операции над двоично-десятичными числами:

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

Сложение упакованных BCD-чисел

Вначале разберемся с сутью проблемы и попытаемся сложить два двузначных упакованных BCD-числа.

Сложение упакованных BCD-чисел

67 = 0110 0111

+

75 = 0111 0101

=

142 = 1101 1100 = 220

Как видим, в двоичном виде результат равен 1101 1100 (или 220 в десятичном представлении), что неверно. Это происходит по той причине, что микропроцессор не подозревает о существовании BCD-чисел и складывает их по правилам сложения двоичных чисел. На самом деле, результат в двоично-десятичном виде должен быть равен 0001 0100 0010 (или 142 в десятичном представлении).

Видно, что как и для неупакованных BCD-чисел, для упакованных BCD-чисел существует потребность как-то корректировать результаты арифметических операций.

Микропроцессор предоставляет для этого команду daa:

Daa (Decimal Adjust for Addition) -- коррекция результата сложения для представления в десятичном виде.

Команда daa преобразует содержимое регистра al в две упакованные десятичные цифры по алгоритму, приведенному в описании команды daa.

Получившаяся в результате сложения единица (если результат сложения больше 99) запоминается в флаге cf, тем самым учитывается перенос в старший разряд.

Аналогично сложению, микропроцессор рассматривает упакованные BCD-числа как двоичные и, соответственно, выполняет вычитание BCD-чисел как двоичных.

Вычитание упакованных BCD-чисел

Выполним вычитание 67-75. Так как микропроцессор

Выполняет вычитание способом сложения, то и мы последуем

Этому:

67 = 0110 0111

+

-75 = 1011 0101

=

-8 = 0001 1100 = 28 ???

Как видим, результат равен 28 в десятичной системе счисления, что является абсурдом. В двоично-десятичном коде результат должен быть равен 0000 1000 (или 8 в десятичной системе счисления).

При программировании вычитания упакованных BCD-чисел программист, как и при вычитании неупакованных BCD-чисел, должен сам осуществлять контроль за знаком. Это делается с помощью флага cf, который фиксирует заем из старших разрядов.

Само вычитание BCD-чисел осуществляется простой командой вычитания sub или sbb. Коррекция результата осуществляется командой das:

Das (Decimal Adjust for Substraction) -- коррекция результата вычитания для представления в десятичном виде.

Команда das преобразует содержимое регистра al в две упакованные десятичные цифры по алгоритму, приведенному в описании команды das.

Стандарты кодирования текстов

Разные стандарты кодировки для разных алфавитов Стандарт кодировки, сохраняемый вместе с текстовым файлом, предоставляет информацию, необходимую для того, чтобы отображать текст на экране. Например, в кодировке "кириллица (Windows)" знаку Й соответствует числовое значение 201. При открытии файла, содержащего эту букву, на компьютере, использующем кодировку "кириллица (Windows)", будет прочтено числовое значение 201 и на экране отобразится знак Й.

Однако если тот же самый файл открыть на компьютере, использующем другую кодировку, то он отобразит знак, которому соответствует числовое значение 201, в том стандарте кодировки, который использует данный компьютер по умолчанию. Например, если компьютер использует стандарт кодировки "Западная Европа (Windows)", этот знак в оригинальном файле, созданном в кодировке "кириллицы", будет отображаться как E, а не Й, поскольку в кодировке "Западная Европа (Windows)" значение 201 отображает знак E.

Юникод: единый стандарт кодировки для множества алфавитов

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

Стандарт представления символов ASCII - это 7-битовое описание кода символа. Поскольку в персональных компьютерах используются байты, состоящие из 8 бит, производители компьютеров часто определяют наборы символов, использующие 256 кодов вместо 128 кодов ASCII. В результате получается "расширенный набор символов" (extended character set), который включает в себя набор символов ASCII и до 128 других символов.

ASCII - коды десятичных цифр

Десятичная цифра

ASCII - код

Десятичная цифра

А8СП-код

0

$30

5

$35

1

$31

6

$36

2

$32

7

$37

3

$33

8

$38

4

$34

9

$39

Расширенный набор символов, который Windows и программы для Windows в большинстве случаев используют, называется набор символов ANSI (ANSI character set), фактически он является международным стандартом ISO.

Стандарт кодировки символов UNICODE. Стандарт Unicode был предложен некоммерческой организацией Unicode Consortium, образованной в 1991 г. Для представления каждого символа в этом стандарте используются два байта: один байт для кодирования символа, другой для кодирования признака. Тем самым обеспечивается информационная совместимость данного способа кодирования со стандартом ASCII.

Похожие статьи




2.Двоично-десятичное кодирование - Разработка программ преобразования форматов двоичных данных и сортировок

Предыдущая | Следующая