Запись чисел в различных форматах
Шестнадцатеричный формат записи часто еще обозначают как HEX (hexadecimal ), двоичный – как BIN (binary ), а десятичный – как DEC (decimal ). Кроме этого, в ходу еще так называемый двоично‑десятичный формат – BCD (binary‑coded decimal ), о котором далее. Дело в том, что с помощью матричных шрифтов на компьютерах с текстовыми дисплеями воспроизводить индексы было невозможно, и вместо того, чтобы обозначать основания системы цифрой справа внизу, их стали обозначать буквами: «В» (или «Ь») – означает двоичную систему, «Н» (или «h») – шестнадцатеричную, отсутствие буквы означает десятичную систему:
13 = 00001101b = 0Dh.
Такая запись принята в языке ассемблера для процессоров Intel и стала общепринятой. Популярность языка С внесла в это дело некоторый разнобой: там десятичная система не обозначается никак, двоичная – буквой «Ь», а вот шестнадцатеричная – буквой «х», причем запись во всех случаях предваряется нулем (чтобы не путать запись числа с идентификаторами переменных, которые всегда начинаются с буквы):
13 = 0b00001101 = 0xD.
Такая запись также принята в ассемблере для микроконтроллеров AVR, который мы будем изучать далее. Запись ODh ассемблер AVR не «понимает», зато «понимает» представление НЕХ‑формата, принятое в языке Pascal: $0D. Обратите внимание, что запись в НЕХ‑формате обычно ведется в двухразрядном виде – даже если число имеет всего один значащий разряд, как в нашем случае, то в старшем пишется 0. То же самое относится и к двоичной записи, которая дополняется нулями до восьми разрядов. Таким образом подчеркивается, что речь идет о восьмиразрядных устройствах. А вот для десятичного представления ведущих нулей следует остерегаться – чтобы еще больше запутать пользователя, разработчики AVR‑ассемблера приняли для представления редко употребляемых восьмеричных чисел запись просто с ведущим нулем, без букв: например, 77 означает просто десятичное 77, а вот 077 будет означать 7·8 + 7 = 6310.
Несколько слов о двоично‑десятичном формате BCD. Электронные устройства «заточены» под использование двоичных и родственных им систем счисления, потому что основой являются два состояния, т. е. двоичная цифра. Так что, соединив несколько устройств вместе с целью оперирования с многоразрядными числами, мы всегда будем получать именно двоичное число, и оперировать с ним оказывается значительно проще. Но для понимания человеком десятичный формат необходим – в десятичном виде числа приходится представлять всегда, когда речь идет о выводе, например, на цифровой дисплей. Для этой цели приходится преобразовывать двоичные/шестнадцатеричные числа в десятичные и хранить их в таких же байтовых регистрах или ячейках памяти.
Это можно делать двумя путями: в виде упакованного и неупакованного BCD. Неупакованный формат попросту означает, что мы тратим на каждую десятичную цифру не тетраду, как минимально необходимо, а целый байт. Зато при этом не возникает разночтений: 05h = 0510, и никаких проблем. Однако ясно, что это крайне неэкономично – байтов требуется в два раза больше, а старший полубайт при этом все равно всегда ноль. Потому BCD‑числа при хранении и передаче по каналам связи всегда упаковывают, занимая и старший разряд второй десятичной цифрой, – скажем, число 59 при этом и запишется, как просто 59h. Однако 59h – это не 59! Ведь мы раньше установили, что записи 59h соответствует 5·16 + 9 = 89, что вообще ни в какие ворота не лезет.
Причина в том, что двоично‑десятичная запись числа не совпадает с шестнадцатеричной. Поэтому в общем случае перед проведением операций с упакованными BCD‑числами их распаковывают, перемещая старший разряд в отдельный байт и заменяя в обоих байтах старшие полубайты нулями. Иногда для проведения операций с BCD‑числами в микропроцессоре или микроконтроллере предусмотрены специальные команды, так что «вручную» заниматься упаковкой‑распаковкой не требуется. В качестве примера хранения чисел в упакованном BCD‑формате можно привести значения часов, минут и секунд в микросхемах энергонезависимых часов RTC (о них см. главу 22 ).
Дата добавления: 2016-05-11; просмотров: 1715;