24.
Типовые форматы чисел (лекция 24)Унификация форматов данных необходима по соображениям совместимости различных аппаратных и программных средств. В простейших микро-ЭВМ с процессорами уровня не выше i80286 без дополнительного арифметического сопроцессора аппаратные операции приспособлены к двум форматам: "слово" и "полуслово" (рис. 24.1).
Рис. 24
.1При составлении программ на языке ассемблера этим форматам придается смысл чисел без знака или чисел со знаком
. В первом случае числа (модули) используются для формирования цепочек различного назначения, представления десятичных цифр и др. В простейшем, как бы “чистом” виде, число без знака - это положительное число от 0 до 255 (полуслово) или от 0 до 65 535 = 216 - 1 (слово). Во втором случае эти форматы соответствуют целым двоичным числам от - 128 до 127 (полуслово) и от - 32 768 до 32 767 (слово). Отрицательные числа здесь представлены в дополнительном коде.Разница между числами со знаком и числами без знака определяется программой вычислений путем анализа флагов и заданной реакцией на те или иные ситуации. Аппаратные микропрограммы для этих чисел одинаковы, за исключением умножения и деления, которые имеют два варианта: для чисел без знака
MUL и DIV и для чисел со знаком - IMUL и IDIV.Форматы со знаком являются основными для арифметики, правила выполнения операций не отличаются от описанных выше в соответствующих лекциях. Полуслово для участия в арифметической операции расширяется до слова по правилу для дополнительного кода. При переполнении числа со знаком устанавливается флаг переполнения, тогда как при переполнении числа без знака устанавливается только флаг переноса.
Если в машине установлен более совершенный процессор (i80386), но отсутствует арифметический сопроцессор, то отличие форматов состоит только в увеличении вдвое длины разрядной сетки чисел. В современных процессорах ПЭВМ основной и арифметический сопроцессоры конструктивно совмещены, но форматы основного процессора (двухбайтовый и четырехбайтовый) остаются такими же.
Форматы данных арифметического сопроцессора более сложны и разнообразны, а сам
арифметический сопроцессор предназначен для работы с плавающей арифметикой. В старых моделях ПЭВМ такой сопроцессор устанавливался по желанию покупателя в качестве самостоятельного конструктивного модуля i80287 или i80387. В настоящее время плавающая арифметика используется для отображения графики и масштабируемых шрифтов. Поэтому она стала обязательной, а арифметический сопроцессор стал частью единого процессорного модуля. Форматы чисел показаны на рис. 24.2.Рис. 24
.2Во всех семи форматах старшая цифра кодирует знак числа. Первые шесть форматов для арифметического сопроцессора являются внешними. В этих форматах числа (целиком или по частям) пересылаются из устройства в устройство и хранятся в памяти.
Из внешних форматов первые три изображают двоичные целые числа со знаком в дополнительном коде. Они используются основным процессором непосредственно, если выполняется команда для чисел с фиксированной точкой. В этом случае действия над ними не отличаются от обычных операций с фиксированной точкой. Нуль имеет одно значение, ложный отрицательный нуль 10.....00 воспринимается как код неопределенности, операции с ним не выполняются.
Для выполнения операций с плавающей точкой целые числа преобразуются во внутренний вещественный формат. Результат операции перед выгрузкой проходит обратное преобразование. Три формата целых чисел в современной ПЭВМ приняты для того, чтобы в одних случаях обеспечивать относительно большой диапазон представимых чисел, а в других - экономно использовать имеющуюся память.Формат ДД изображает целые десятичные числа в прямом коде. После знаковой цифры идут семь разрядов, которые должны быть заполнены нулями. Далее идут 18 тетрад двоично-десятичного кода с естественными весами 8421 (подробное рассмотрение двоично-десятичных кодов будет сделано в следующей лекции).
Неопределенность в этом формате выражается как 1111 1111 1111 1111 ХХХХ.... Иначе говоря, в знаковом разряде, в неиспользуемых семи разрядах и следующих двух тетрадах должны находиться единицы, остальные цифры не имеют значения. При загрузке в процессор двоично-десятичные числа сначала переводятся в двоичную систему, а затем во внутренний вещественный формат. При выгрузке результат проходит обратные преобразования.Форматы КВ и ДВ являются двумя внешними форматами с плавающей точкой. В первом из них характеристика имеет восемь цифр, а во втором - одиннадцать. Длина модуля мантиссы соответственно равна 23 или 52 разрядам, причем во внешних вещественных форматах отсутствует целая часть модуля. Поэтому во внешних форматах могут существовать только нормализованные числа, единица в целой части которых непременно имеется, а поэтому может не записываться, а лишь подразумеваться. Напоминаем, что в современных ПЭВМ принято условие нормализации
2 > |M| 1.
Формат ВВ является рабочим форматом арифметического сопроцессора, в котором выполняются все доступные для этого модуля операции. Эта оговорка связана с тем, что в младших моделях сопроцессоров не предусмотрена обработка длинных целых и двоично-десятичных чисел.
Необходимость преобразования чисел при загрузке и выгрузке и разнообразие внешних форматов усложняют микропрограммы арифметических операций, но зато применение сопроцессора позволяет резко улучшить все характеристики вычислительного процесса: быстродействие, точность и диапазон представления чисел. Сопроцессор упрощает программирование, так как переводит управление операциями с плавающей точкой на аппаратный уровень
. Предельные значения порядков чисел в разных вещественных форматах показаны в таблице 24.1.Таблица 24
.1Использованный в этой таблице
порядок вычислений поясняет пример расчета для формата ВВ:Наименьшее возможное значение характеристики, равное нулю, не используется для изображения чисел с большими отрицательными порядками, оно применяется только для кодирования нуля и некоторых особых ситуаций, описываемых ниже. Аналогично обстоит дело и наибольшими возможными значениями характеристик: 255, 2047 и 32 767 - они служат кодами особых ситуаций. По этой причине диапазон представимых в вещественных форматах чисел немного уменьшен, но он остается достаточно широким, чтобы удовлетворять все практические потребности.
При работе арифметического сопроцессора могут иметь место характерные ситуации, приведенные в таблице 24
.2.Таблица 13.2
Старшая цифра модуля мантиссы в таблице заключена в скобки. Это напоминает о том, что во внешних форматах она отсутствует. Особого пояснения требуют ненормализованные и денормализованные числа, разница между которыми принципиальна.
Ненормализованные числа существуют только в формате ВВ. У них обычная ненулевая характеристика и ненулевая мантисса, но в целой части мантиссы находится нуль. Такое число нельзя выгрузить в память. Вместо него выдается код неопределенности (в том формате, в котором должна была произойти выгрузка) и устанавливается флаг недействительной операции
IE. Он устанавливается также при делении на ненормализованное число. В других операциях ненормализованные числа могут участвовать без ограничений, причем результат может получиться нормализованным или нет, в зависимости от операции.Денормализованное число во внутреннем формате имеет нулевую характеристику и любую ненулевую мантиссу. Его перевод в любой внешний формат дает нуль, при выгрузке устанавливается флаг антипереполнения
UE. Денормализованное число во внешних вещественных форматах имеет нулевую характеристику и обычную нормализованную мантиссу. Источником таких чисел является преобразование в форматы КВ или ДВ при выгрузке малых чисел, находящихся на грани превращения в машинный нуль.Уже говорилось, что при загрузке в арифметический сопроцессор и при выгрузке из него числа проходят специальное преобразование.
Сравнительно просто происходит загрузка чисел с плавающей точкой. Знаковая цифра формата КВ или ДВ записывается в старший разряд формата ВВ. В поле характеристики внутреннего формата помещается характеристика загружаемого операнда и к ней прибавляется переходная константа, представляющая разность смещений порядков внутреннего и внешнего формата.При загрузке числа формата КВ эта константа равна 16383 -
127 = 16256 или, в шестнадцатеричном представлении: 3FFFH - 7FH = 3F80H. В поле модуля мантиссы записывается загружаемая мантисса. Она занимает разряды дробной части от 62-го до 40-го или до 11-го в зависимости от первоначального формата. В старший разряд поля мантиссы внутреннего формата записывается единица, представляющая целую часть нормализованного модуля. Никаких осложнений или особых ситуаций при загрузке не происходит.При выгрузке в вещественный формат происходит обратное преобразование. Прежде всего мантисса должна быть нормализована. затем к характеристике прибавляется константа, равная
- 3F80H (для выгрузки в формат КВ):Сложение происходит по правилу для дополнительных кодов, т.е. в данном случае по модулю 8 000Н. Если при прибавлении константы из старшего разряда происходит перенос, то это означает получение положительного результата. В противном случае результат отрицательный, и это говорит о невозможности выгрузить его в заданном формате. В последнем случае выдается нуль и устанавливается флаг
UE.Положительный результат проверяется на переполнение. При выгрузке в формат КВ, в котором характеристика занимает только восемь разрядов, необходимо, чтобы старшие семь разрядов поля характеристики ВВ были свободными (не содержали ни одной единицы). В противном случае вместо числа выгружается код неопределенности и устанавливается флаг ОЕ.
Процесс загрузки и выгрузки целых чисел сложнее. Рассмотрим загрузку чисел формата КЦ
(рис. 24.3).Рис. 24
.3Из рисунка ясна схема преобразования. В разряды мантиссы ВВ от 33-го до 63-го включительно записываются цифры загружаемого числа. Младшие 33 разряда мантиссы просто обнуляются.
Необходимо изменить расположение запятой, которая у загружаемого целого числа находится справа от младшей цифры. Эта цифра попадает в 33-ий разряд поля мантиссы ВВ. Перенося запятую влево на 30 разрядов мы обязаны на столько же единиц увеличить характеристику. Поэтому в поле характеристики записывается не просто смещение d, а сумма смещения и числа 30, которое в шестнадцатеричном представлении равно 1ЕН.В результате описанных операций во внутреннем формате
, скорее всего, окажется ненормализованное число, которое должно будет пройти обычную нормализацию. При выгрузке в формат КЦ из характеристики нормализованного числа вычитается константа 401DH, т.е. прибавляется.
Тем самым смещение аннулируется, а запятая переносится на 30 разрядов вправо. При прибавлении константы контролируется состояние триггера переноса. Если перенос из поля характеристики состоялся, а содержимое поля не равно нулю, то фиксируется переполнение - результат не может разместиться в формате КЦ. При наличии переноса и нулевого содержимого характеристики число готово к выгрузке. Если же переноса не было, т.е. при отрицательном результате, делаются сдвиги мантиссы вправо с одновременным прибавлением единицы к характеристике, до тех пор, пока характеристика не обнулится. Только после этого число принимает вид, пригодный для выгрузки.