Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объединения_Лекция2.doc
Скачиваний:
10
Добавлен:
22.02.2015
Размер:
98.3 Кб
Скачать

Void binkod (tip n, char s[])

{//функция формирует строку s с двоичным представлением //вещественного данного n.

int i, j , m;

i=0; //индекс байта строки u.

q.a = n; //значение n помещается в объединение q

m=L<<3 –1; //индекс последнего бита строки s.

do

{unsigned char x;

x=q.u[i++]; //запись в x очередного i-го байта из u

for( j=0; j<8; j++) // цикл формирует биты от 0 до7

{s[m--] = (x&1)+'0'; // i-го байта строки s.

x=x>>1;

}

}

while (i<L);

s[L<<3]=0; //нуль символ в конец строки s.

}

//Внутреннее 16-ричное представление целого.

void hexkod (tip n, char s[ ])

{int i,m;

unsigned char x;

char alf[ ]="0123456789ABCDEF";//алфавит 16-ой системы счисления

i=0; m=L<<1 –1;

do

{x=q.u[i++];

s[m--]=alf[x&15]; // младшая 16-ричная цифра i-го байта u

s[m--]=alf[(x>>4)]; // старшая 16-ричная цифра i-го байта u

}

while (i<L);

s[L<<1]='\0'; //нуль символ в конец строки s.

}

int main ()

{double x;

char t[L<<3+1];

cout<< "\n double—x= ";

cin>> x;

binkod(x,t); cout<< x<< ": \n"<<t<<endl;

hexkod (x,t); cout<< x<< ": "<<t<<endl;

return 0;

}

Выполнение этой программы

double—-x= 3.5

3.5:

0100000000001100000000000000000000000000000000000000000000000000

3.5: 400C000000000000

Замечание 1. Этот способ доступа к значению типа tip (с union ) может быть применён для значения другого простого типа, например, int. Это более универсальный способ. Для использования этой программы для типа int достаточно изменить одно предложение:

typedef int tip;

В главе «Битовые операции» для получения внутреннего кода данных типа int был рассмотрен другой способ с использованием битовых операций и операций сдвига. Тот способ не приемлем для вещественных данных, так как для них не определены битовые операции и операции сдвига.

Замечание 2. Шаблон функции.

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

Простейшая функция-шаблон с параметром tip имеет вид:

template <class tip> заголовок_функции

{/*тело функции*/}

Пример шаблона функции с параметром tip для получения строки внутреннего двоичного кода данного этого типа.

#include <iostream>

using namespace std;

template <class tip>

Void binkod (tip n,char s[])

{//функция формирует строку s с двоичным представлением //вещественного данного n.

const int L=sizeof(tip); // размер типа в байтах

union {

tip a;

unsigned char u[L];

}q;

int i,j,m;

i=0; //индекс байта строки u.

q.a=n; //значение n помещается в объединение q

m=L<<3–1; //индекс бита строки s.

do

{unsigned char x;

x=q.u[i++]; //запись в x очередного байта из u

for( j=0;j<8;j++) // цикл формирует биты от 0 до7

{s[m--]=(x&1)+'0'; // m-го бита строки s.

x=x>>1;

}

}

while (i<L);

s[L<<3]=0; //нуль символ в конец строки s.

}

template <class tip>