Запись десятичных чисел (двоично-десятичный код). Двоичная система счисления Операции в двоично десятичной системе

26.08.2020 Мониторы

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

Двоично-десятичный код Десятичный код
0 0 0 0 0
0 0 0 1 1
0 0 1 0 2
0 0 1 1 3
0 1 0 0 4
0 1 0 1 5
0 1 1 0 6
0 1 1 1 7
1 0 0 0 8
1 0 0 1 9

Остальные комбинации двоичного кода в тетраде являются запрещенными. Запишем пример двоично-десятичного кода:

1258 = 0001 0010 0101 1000

В первой тетраде записана цифра 1, во второй — 2, в третьей — 5, а в последней тетраде записана цифра 8. В данном примере для записи числа 1258 потребовалось четыре тетрады. Количество ячеек памяти микропроцессора зависит от его разрядности. При 16-разрядном процессоре все число уместится в одну ячейку памяти.

589 = 0000 0101 1000 1001

В данном примере для записи числа достаточно трех тетрад, но ячейка памяти 16-разрядная. Поэтому старшая тетрада заполняется нулями. Они не изменяют значение цифры. Если бы мы заполнили нулями младшую тетраду, то число увеличилось бы в десять раз!

При записи десятичных чисел часто требуется записывать знак числа и десятичную запятую (в англоязычных странах точку). Двоично-десятичный код часто применяется для набора телефонного номера или набора кодов телефонных служб. В этом случае кроме десятичных цифр часто применяются символы "*" или "#". Для записи этих символов в двоично-десятичном коде применяются запрещенные комбинации

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

1258 =00000001 00000010 00000101 00001000

В первой строке записана цифра 1, во второй - 2, в третьей - 5, а в последней строке записана цифра 8. В данном примере для записи числа 1258 потребовалось четыре строки (ячейки памяти)

589 = 00000000 00000101 00001000 00001001

Суммирование двоично-десятичных чисел.

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

Представление чисел в памяти компьютера имеет специфическую особенность, связанную с тем, что в памяти компьютера они должны располагаться в байтах – минимальных по размеру адресуемых ячейках памяти. Вся память компьютера разбита на отдельные участки из 8 бит (т.е. на байты). Байты имеют номера: 0, 1, 2, …, называемые адресами. Два соседних участка: 0 и 1, 2 и 3 и т.д. образуют ячейку памяти ЭВМ. Т.е. одна ячейка памяти может хранить два байта или 16 битов информации. Для содержимого одной ячейки используют название – «машинное слово» или просто «слово». Очевидно, адресом числа считается адрес первого байта, т.е. четные числа, начиная с 0, 2, 4, 6 и т.д. В байте может содержаться произвольный код из восьми двоичных разрядов, и задача представления состоит в том, чтобы указать правила, как в одном или нескольких байтах записать число.

Числа могут быть целые точные, дробные точные, рациональные, иррациональные, дробные приближенные, положительные и отрицательные. Числа могут быть «карликами» (например, масса атома), «гигантами» (например, масса земли), реальными (например, количество студентов в группе, рост, возраст). И каждое из чисел потребует для оптимального представления в памяти свое количество байтов.

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

Целые числа . Целые положительные числа от 0 до 255 можно представить непосредственно в двоичной системе счисления (двоичном коде). Такие числа будут занимать один байт в памяти компьютера.

В такой форме представления на компьютере легко реализуется двоичная арифметика. Знак числа «плюс» или «минус» кодируется отдельным битом. Обычно это старший бит. Ноль интерпретируется, как «плюс», единица - как «минус». Таким образом, одним байтом могут быть закодированы целые числа в интервале от –128 до +127. Двоичная арифметика при этом будет несколько усложнена, т.к. в этом случае существуют два кода, изображающих число ноль 00000000 и 100000000. В компьютере на аппаратном уровне это необходимо предусмотреть. Данный способ представления целых чисел называется прямым кодом . С отрицательными числами несколько проще, если использовать дополнительный код. В дополнительном коде положительные числа совпадают с положительными числами в прямом коде, отрицательные же числа получаются в результате вычитания из 100000000 соответствующего числа. Например, число –3 получит код:

В дополнительном коде хорошо реализуется арифметика. Каждый последующий код получается из предыдущего прибавлением единицы с точностью до бита в девятом разряде. Например, 5 – 3 = 5 + (-3)

1 00000010

Отбрасывая подчеркнутый старший разряд, получим 2.

Аналогично целые числа от 0 до 65536 и целые числа от –32768 до 32767 в двоичной (шестнадцатеричной) системе счисления представляются в двухбайтовых ячейках. Существуют представления целых чисел и в четырехбайтовых ячейках.

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

Для представления действительных чисел, как очень маленьких, так и очень больших, удобно использовать форму записи чисел в виде произведения:

Где m- основание системы счисления;

P – целое число, называемое порядком.

Такой способ записи чисел называется представлением числа с плавающей точкой .

Т.е. число 1234,56 может быть записано:

1234,56 = 123,456*10 1 = 12,3456*10 2 = 1,23456*10 3 = 0,123456*10 4 .

Такое представление не однозначно. Если мантисса (0,1 для десятичной С.С.), то представление числа становится однозначным, а такая форма называется нормализованной . Если «плавающая» точка расположена в мантиссе перед первой значащей цифрой, то при фиксированном количестве разрядов, отведенных под мантиссу, обеспечивается запись максимального количества значащих цифр числа, т.е., максимальная точность.

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

Смещенный порядок Мантисса

мантиссы

Первый разряд представления используется для записи знака мантиссы. За ним – группа разрядов, определяющих порядок, а остальные разряды определяют абсолютную величину мантиссы. Размеры обеих групп разрядов фиксируются. Т.к. порядок может быть положительным или отрицательным, нужно решить проблему его знака. Величина порядка представляется с избытком, т.е., вместо истинного значения порядка хранится число, называемое характеристикой (или смещенным порядком ). Для получения характеристики надо к порядку прибавить смещение. Например, при использовании для хранения порядка восьми бит и значений от –128 до +127 используется смещение 128. Тогда для представления порядка будут использоваться значения от 0 до 255, т.е. только неотрицательные числа.

Т.к. мантисса нормализованного числа всегда равна 1, некоторые схемы представления ее лишь подразумевают, используя лишний разряд для повышения точности представления мантиссы.

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

Как и в случае целых чисел, в программных системах могут использоваться несколько типов данных, реализующих модель с плавающей точкой. Например, в языке СИ применяются три типа данных с разной «длиной». Шестнадцатиразрядные компиляторы для IBM-совместимых ПК реализуют эти типы следующим образом:

Float – 4 байта, из них 23 разряда мантиссы и 8 битов порядка

(от 3,4*10 -38 до 3,4*10 38 , обеспечивает точность с 7 значащими цифрами);

Double – 8 байтов, из них 52 разряда мантиссы и 11 битов порядка

(от 1,7*10 -308 до 1,7*10 308 , обеспечивает точность с 15 знаками);

Long double – 10 байтов, из них 65 разрядов мантиссы и 14 битов порядка

(от 3,4 * 10 -4932 , обеспечивает точность с 19 знаками).

Понятие типа данных . Мы уже говорили, что минимально адресуемой единицей памяти является байт, но представление числа требует большего объема. Такие числа займут группу байт, а адресом числа будет адрес первого байта группы. Следовательно, произвольно взятый из памяти байт ничего не скажет о том, частью какого информационного объекта от является – целого числа,числа с плавающей точкой или командой. Отсюда можно сделать вывод, что кроме задачи представления данных в двоичном коде, параллельно решается обратная задача – интерпретации кодов, т.е. как из кодов восстановить первоначальные данные.

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

(Методическая разработка)

Задание: Преобразовать числа, выраженные в десятичной форме, в двоичную форму, затем произвести умножение.

Примечание: Правила умножения точно такие же, как и в десятичной системе счисления.

Умножить: 5 × 5 = 25

Преобразуем десятичное число 5 в двоичный код

5: 2 = 2 остаток 1 Полученный результат

2: 2 = 1 остаток 0 записываем в обратном

1: 2 = 0 остаток 1 порядке

Таким образом: 5 (10) = 101 (2)

Преобразуем десятичное число 25 в двоичный код

25: 2 = 12 остаток 1

12: 2 = 6 остаток 0 Полученный результат

6: 2 = 3 остаток 0 записываем в обратном

3: 2 = 1 остаток 1 порядке

1: 2 = 0 остаток 1

Таким образом: 11001 (2) = 25 (10)

Производим проверку:

Производим двоичное умножение

×
101
+
101

Правила умножения в двоичной системе точно такие же, как и в десятичной системе счисления.

1) 1 × 1, будет 1, записываем 1.

2) 1 × 0, будет 0, записываем 0.

3) 1 × 1, будет 1, записываем 1.

4) Записываем три нуля, причем первый ноль под вторым знаком (нулем).

5) Умножение 1 × 101 точно такое же, как и п.п. 1, 2, 3.

Производим операцию сложения.

6) Сносим и записываем 1.

7) 0 +0 будет ноль, записываем 0.

8) 1 + 1 будет 10, записываем ноль, а единицу переносим в старший разряд.

9) 0 + 0 + 1 будет 1, записываем 1

10) Сносим и записываем 1.

Задание 1: Выполнить умножение в двоичной форме

Задание: Преобразовать числа, выражение в десятичной форме, в двоичную форму, затем произвести деление.

Примечание: Правила деления точно такие – же, как и в десятичной системе счисления.

Если результат делится без остатка, записываем – 0, иначе (с остатком) – 1

Разделить: 10:2 = 5

Преобразуем десятичное число 10 в двоичный код:

10:2 = 5 остаток 0 5:2 = 2 остаток 1 2:2 = 1 остаток 0 1:2 = 0 остаток 1

Полученный результат

записываем в обратном

Таким образом: 1010 (2) = 10 (10)

Преобразуем десятичное 2 в двоичный код

2:2 = 1 остаток 0

1:2 = 0 остаток 1



Таким образом: 10 (2) = 2 (10)

Преобразуем десятичное 5 в двоичное код

5:2 = 2 остаток 1

2:2 = 1 остаток 0

1:2 = 0 остаток 1

Таким образом: 101 (2) = 5 (10)

Производим проверку:

1010 (2) = 0×2 0 + 1×2 1 + 0×2 2 + 1×2 3 = 0 +2+0+8 =10 (10)

10 (2) = 0×2 0 +1×2 1 = 0 +2 = 2 (10)

101 (2) = 1×2 0 +0×2 1 +1×2 2 = 1+ 0+4 = 5 (10)

Производим двоичное деление:

1010 (2) : 10 (2) = 101 (2)

1010 (2) 10
10

Правила деления в двоичной системе точно такие же, как и в десятичной.

1) 10 разделить на 10. Берём по 1, в результат записываем 1.

2) Сносим 1 (единицу), не хватает, занимаем 0 (ноль).

3) Берём по 1. Из 10 (десяти) вычесть 10 получается ноль, что и соответствует
действительности.

Задание 1: Выполнить деление в двоичной форме

1) 10010 (2) : 110 (2) =

11000 (2) : 110 (2) =

2) 110110 (2) : 110 (2) =

Задание 2: Полученный результат восстановить в десятичной форме.

Задание: Вычесть числа, выраженные в двоичной форме, полученный результат восстановить в десятичную форму.

Вычесть: 1100 (2) – 110 (2) =

Правила вычитания в двоичной форме.

Вычитание в двоичной форме подобно вычитанию в десятичной системе.

110 0 + 0 = 0

110 0 + 1 = 1

1) 0 плюс 0 равно 0 (См. правила сложения чисел).

2) 1 плюс 1 равно 10. Записываем ноль, а единицу переносим в старший разряд, как и в десятичной системе

3) 1 плюс 1 плюс 1 равно 11 – двоичное число. Записываем 1, а вторую единицу
переносим в старший разряд. Получаем: 1100 (2) , что и соответствует действительности.

Задание: Произвести проверку полученного результата.

1100 (2) = 0×2 0 + 0×2 1 +1×2 2 +1×2 3 = 0 + 0 + 4 + 8 = 12 (10)

110 (2) = 0×2 0 +1×2 1 +1×2 2 = 0 + 2 + 4 = 6 (10)

Таким образом, получаем: 6 + 6 = 12, что соответствует действительности.

Выполнить самостоятельно:

Задание 1. Выполнить вычитание в двоичной форме:

+
1010 10 (10)

110 6 (10)

10000 соответствует: 16 (10)

Выполнение действий происходит следующим образом.

1) 0 плюс 0 равно О

2) 1 плюс 1 равно 10 (что 2 (два) в двоичной системе представляется как 10);
Исторически сложилось, что для сложения чисел использовалось десять пальцев и наоборот:

9 + 1 = 10; 8 + 2 = 10; 1 + 9 = 10; 2 + 8 = 10.

Поэтому и произошла десятичная система счисления. А в двоичной 2 (два) знака: 1 и 0

3) 1 плюс 0 плюс 1 равно 10. Записываем 0 и переносим 1.

4) 1 плюс 1 равно 10, поскольку это последнее действие, записываем 10, точно также сделали это в десятичной системе.

Задание: Произвести проверку полученного результата:

110

Двоично-десятичная система счисления. Десятичные цифры от 0 до 9 заменяются представляющими их двоичными тетрадами: 0=0000, 1=0001, 2=0010, 3=0011, 4=0100, 5=0101, 6=0110, 7=0111, 8=1000 и 9=1001. Такая запись очень часто используется как промежуточный этап перевода числа из десятичной системы в двоичную или обратно. Так как 10 не является точной степенью 2, то используются не все 16 тетрад, а алгоритмы арифметических операций над многозначными числами здесь более сложны, чем в основных системах счисления. И тем не менее, двоично-десятичная система счисления применяется даже на этом уровне во многих микрокалькуляторах и некоторых компьютерах (в частности, «Ямаха» стандарта MSX).

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

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

Десятичное число 3 6 9 1 Двоично-десятичное число 0011 0110 1001 0001

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

Двоично-десятичное число 1000 0000 0111 0010 Десятичное число 8 0 7 2

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

Преобразование двоичных чисел в двоично-десятичные

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

В данном разделе рассматриваются программы преобразования двоичных чисел в двоично-десятичные.

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

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

Упакованный BCD-код - это такое представление десятичного числа, когда каждая десятичная цифра представляется 4-х битным двоичным позиционным кодом 8-4-2-1. При этом байт содержит две десятичные цифры. Младшая десятичная цифра занимает правую тетраду (биты 3: 0), старшая - левую тетраду (биты 7: 4). Многоразрядные BCD-числа занимают несколько смежных байт. Если число является знаковым, то для представления знака в BCD-формате отводится старшая тетрада старшего байта. Для кодирования знака можно использовать шесть двоичных кодовых комбинаций, которые не используются для представления десятичных цифр. Это коды 1010-1111 (A-F в шестнадцатеричном представлении). Обычно для кодирования знака плюс применяют код 1100 (С), а для знака минус - 1101 (D).

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

2. Преобразование целых 16-битных чисел в двоично-десятичные числа

На сайте www.atmel.com предлагается программа "bin2bcd16" для преобразования целых 16-битных двоичных чисел в двоично-десятичные упакованные числа. В данной статье рассматривается программа "bin16bcd5" (см. Приложение, Программа 1), написанная Терешкиным А. В. согласно алгоритму, изложенному в , и выполняющая ту же задачу. Последняя программа по быстродействию, длине кода и количеству используемых регистров оказалась более эффективной, чем первая.

Алгоритм программы "bin16bcd5" заключается в следующем. Предположим, что имеется целое беззнаковое 16-битное число (диапазон от 0 до 65535). Очевидно, что необходимо найти 5 десятичных цифр. Способ преобразования заключается в том, чтобы, вычитая из исходного числа число 10000, сначала определить десятичную цифру десятков тысяч. Затем находится цифра тысяч последовательным вычитанием числа 1000 и т. д. Вычитание каждый раз производится до получения отрицательной разности с подсчетом числа вычитаний. При переходе к определению каждого следующего десятичного разряда в регистрах исходного числа восстанавливается последняя положительная разность. После того, как будет найдена десятичная цифра десятков, в регистрах исходного числа останется десятичная цифра единиц.

Программа "bin16ASCII5" (см. Приложение, Программа 2) преобразует целое двоичное 16-битное число в десятичное неупакованное число. При этом используется тот же алгоритм.

3. Преобразование двоичной дроби в двоично-десятичную дробь

Двоичная дробь, по определению, представляется следующим выражением:

0.A-1A-2 ... A-m = A-1*2-1 + A-2*2-2 + ... A-m*2-m

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

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

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

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

4. Преобразование чисел с плавающей точкой в двоично-десятичные числа

Представление чисел с плавающей точкой имеет следующий вид:

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

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

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