Материал: Программные преобразования числовой информации (96

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

Операция нормализации влево заключается в последовательном арифметическом сдвиге прямого кода мантиссы влево с одновременным вычитанием единицы при каждом сдвиге из порядка числа. Процесс продолжается до тех пор, пока мантисса не примет нормализованный вид. Чтобы нормализовать число X = 0,00001110 · 2110, имеющее нарушение нормализации вправо на четыре разряда, необходимо выполнить нормализацию влево, и число примет вид 0,11100000 · 2010.

Операция нормализации вправо осуществляется сдвигом мантиссы числа на один разряд вправо с одновременным увеличением порядка на единицу. Если имеющее нарушение нормализации влево число X = 1,1011001 · 2101, то после выполнения операции нормализации вправо число примет вид 0,1101100 · 2110.

В персональных ЭВМ используются два формата представления чисел с плавающей запятой: короткий и длинный, имеющие, соответственно, длину 32 и 64 разряда. Для представления смещенного порядка отведено 8 разрядов (смещение A = 128). В коротком формате двоичная мантисса имеет 23 разряда, а в длинном – 55. Числа в памяти всегда представляются в нормализованной форме, при которой старший разряд мантиссы всегда есть 1, и поэтому его значение не фиксируется, а подразумевается. Таким образом, на один разряд увеличивается точность представления мантиссы. Использование скрытого старшего разряда приводит к тому, что нулевая мантисса неотличима от мантиссы числа 0,5. Поэтому число с нулевой мантиссой имеет код, содержащий все нули в разрядной сетке.

5. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ АЛГОРИТМОВ

Рассмотрим программную реализацию алгоритмов перевода чисел в различных системах счисления на примере перевода чисел с использованием арифметики исходной системы счисления.

Перевод целых чисел. Алгоритм перевода целых чисел с использованием арифметики исходной системы счисления можно реализовать «напрямую» или с использованием механизма рекурсии. Код во втором случае значительно проще:

11

Procedure BinInt (n:Word;var s:String); begin

If n>1 Then BinInt (n div 2,s); s := s+Chr(n Mod 2+Ord('0')); end;

Перевод правильной дроби. Данный алгоритм представим в виде функции:

Function BinFrac(n:real;p:Byte):String; Var

s:String;

i:Byte; Begin

s:='';

For i:=1 To p Do begin

n:= 2*n;

s :=s +Chr(Trunc(n)+Ord('0')); n:= Frac(n);

end; BinFrac :=s;

end;

Таким образом, программа перевода положительного вещественного числа в двоичную систему счисления будет иметь следующий вид:

program BinReal1; Var

x:real;

b:Byte;

sbin:string; begin

Write('Введите вещественное x - ');Readln(x); Write('Введите число двоичных разрядов -');

Readln(b);

BinInt(Trunc(x),sbin);

sbin := sbin+'.'+BinFrac(Frac(x),b);

12

Writeln('В двоичной системе счисления: ',sbin); Readln;

end.

Аналогичным образом можно выполнить перевод числа в любую позиционную систему счисления. Представим процедуру HexInt, в которой реализован рассмотренный алгоритм для преобразования числа в шестнадцатеричную систему счисления, и процедуру WriteHexInt, которая выводит полученный результат на экран, сопровождая его символом $:

Procedure HexInt (n:cardinal;var s:string); Var

nm:byte;

ch:char; begin

If n>15 Then HexInt (n div 16,s); nm:= n mod 16;

If nm <10 Then ch:=Chr(nm+Ord('0')) Else ch:= Chr(nm+Ord('A')-10);

s:=s+ch;

end;

Procedure WriteHexInt(s:string;n:cardinal); var

st:string; begin

HexInt(n,st); st:=s+'$'+st; Writeln(st);

end;

Рассмотрим теперь задачу вывода на экран целого числа в двоичной системе счисления. В данном случае речь идет не о переводе числа в двоичную систему счисления, а о том, в каком виде целые числа хранятся в памяти компьютера. Для этой цели используем операцию поразрядного сдвига:

Procedure BinaryInt (w:cardinal); var

mask : cardinal;

13

begin

mask := $80000000; While mask<>0 Do

begin

If w and mask =0 Then Write ('0') Else Write ('1');

mask := mask shr 1; end;

end;

Представленная процедура выводит на экран значения битов 32-разрядного целого числа (тип cardinal).

Во многих случаях необходимо знать значения бит в области, которая не допускает непосредственного исполнения битовых операторов. Например, расположение бит в вещественном числе типа single, real и т. п. Подобная задача решена выше для целых чисел (cardinal), поскольку целочисленные типы допускают применение операторов битовой логики. Кроме того, тип cardinal при логических сдвигах дополняется нулями, в то время как тип integer дополняется при сдвигах единицами. Один из способов представления вещественного числа в двоичном виде заключается в использовании целочисленного представления области, в которой находится вещественное число. Для этого можно использовать директиву absolute, по которой различные переменные располагаются по одному адресу в памяти, или же определить специальный комбинированный тип с соответствующими вариантными полями. Например, чтобы расположить 32-битовую переменную типа single по адресу переменной типа cardinal, можно объявить следующий комбинированный тип:

Type

rCardSingl = Record

case Byte of

0:(n : cardinal); // целочисленное представление области

1:(f : single); // вещественное представление

области

end;

Var g : rCardSingl;

14

Здесь идентификатор rCardSingl является именем объявляемого типа в венгерской нотации. Префикс r используется для обозначения комбинированного типа. Имя rCardSingl выбрано произвольно согласно обстоятельствам.

Переменная объявленного типа g занимает в памяти 4 байта, поскольку каждая из внутренних переменных занимает также по 4 байта. Особенность в том, что n и f находятся по одному адресу (рис. 1). В этом случае говорят, что это две возможности видения одной области. Доступ к варианту целого числа записывается как g.n, а доступ к варианту вещественного числа – как g.f.

g

 

n:cardinal

 

 

 

 

 

 

 

 

 

 

 

f:single

Рис. 1. Объединенное расположение переменных n и f по одному адресу в переменной комбинированного типа g

Еще одним способом адресного совмещения переменных различных типов является применение директивы absolute:

Var

n: cardinal;

f : single absolute n;

При таком описании значение переменной f располагается по адресу переменной n. В дальнейшем будет использоваться первый вариант объединения.

6. БИТОВАЯ КОНСТРУКЦИЯ ПЕРЕМЕННОЙ ТИПА single

Ниже представлена программа Prog1, в которой тип rCardSingl использован для вывода на монитор бит переменной типа single. Чтобы понять особенности представления вещественных чисел в микропроцессоре, сделаем преобразования для чисел, например 6,25, 1,25, 0,25, и их отрицательных аналогов:

15

Источник: https://studfile.net/preview/16723858/