Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab 1 / 1391_Поникаровский_Аким_1

.docx
Скачиваний:
1
Добавлен:
02.01.2025
Размер:
217.37 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра АПУ

отчет

по лабораторной работе №1

по дисциплине «Организация ЭВМ и систем»

Тема: ИССЛЕДОВАНИЕ ВНУТРЕННЕГО ПРЕДСТАВЛЕНИЯ РАЗЛИЧНЫХ ФОРМАТОВ ДАННЫХ

Вариант - 12

Студент гр. 1391

Поникаровский А. В.

Преподаватель

Анисимов А. В.

Санкт-Петербург

2022

Цель работы

Знакомство с внутренним представлением различных типов данных, используемых компьютером при их обработке.

Основные теоретические положения

При программировании на языке С++ используются 11 стандартных типов данных. Среди них можно выделить 3 группы:

1. данные символьные и целого типа беззнаковые (с фиксированной запятой);

2. данные символьные и целого типа со знаком (с фиксированной запятой), значения которых хранятся в двоичном дополнительном коде;

3. данные вещественного типа (с плавающей запятой (точкой)).

Числовое значение данных первой группы занимает всю разрядную сетку (количество двоичных разрядов от 8 до 32), отведённых под конкретный тип. Знак числа данных второй группы занимает старший (левый) разряд, а остальную часть разрядной сетки (от 7 до 31 двоичных разрядов) занимает числовое значение данных, отведённых под конкретный тип. Формат хранения данных третьей группы описывается IEEE - стандартом в виде значения мантиссы (M) со знаком (S) и значения порядка (P). Число бит для хранения мантиссы и порядка зависит от типа данных с плавающей запятой.

Задание на лабораторную работу

1. В зависимости от номера варианта задания разработать алгоритм ввода с клавиатуры требуемых типов данных и показать на экране их внутреннее представление в двоичной системе счисления. (unsigned char, float)

2. Написать и отладить программу на языке С++, реализующую разработанный алгоритм.

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

Код программы

#include <iostream.h>

#include <cmath>

using namespace std;

union data_double

{

double data;

char mas[64];

};

void print_mas(char mas[], int size)

{

int i;

for (i = 0; i < size; i++)

{

cout << mas[i];

}

cout << endl;

}

void zero_mas(char mas[], int size)

{

int i;

for (i = 0; i < size; i++)

{

mas[i] = '0';

}

}

void output_unsigned_char(unsigned char value, char mas[])

{

int i, d, j = 0;

for (i = 7; i >= 0; i--) {

d = ((value >> i) & 1);

if (d == 0) {

cout << '0';

mas[j] = '0';

}

else if (d == 1) {

cout << '1';

mas[j] = '1';

}

j++;

}

cout << endl;

}

void output_double(data_double Doub, char mas[])

{

int i, j, k = 0;

for (i = sizeof(double) - 1; i >= 0; i--)

{

unsigned char mask = 128;

for (j = 0; j < sizeof(double); j++)

{

if (Doub.mas[i] & mask)

{

cout << '1';

mas[k] = '1';

k++;

}

else

{

cout << '0';

mas[k] = '0';

k++;

}

mask >>= 1;

}

}

cout << endl;

}

void make_shift(char mas[], int digit, int num, char nmas[], int size) {

for (int i = 0; i < size; i++) {

nmas[i] = mas[i];

}

for (int i = digit - num ; i <= digit-1; i++) {

if (i != size - 1) {

if (mas[i] == '1') {

nmas[i + 1] = '1';

}

}

else break;

}

for (int i = digit - 1; i >= digit - num; i--) {

if (i != 0) {

if (mas[i] == '0') {

nmas[i - 1] = '0';

}

}

else break;

}

}

unsigned char make_unsigned_char(char mas[]) {

unsigned char num = '0';

num >>= 6;

int k = 0;

for (int i = 7; i > 0; i--) {

if (mas[i] == '1') num += pow(2, k);

k++;

}

return num;

}

double make_double(char bits[]){

int i, j = 10, exp = 0;

char sign = 0;

double temp = 0, IsxDouble = 0;

double FloatPart;

sign = bits[0];

for (i = 1; i < 12; i++) {

temp = pow(2, j);

if (bits[i] == '1')

{

exp = exp + temp;

}

j--;

}

exp = exp - 1023;

FloatPart = 0;

FloatPart = pow(2, exp);

j = exp - 1;

for (i = 12; i < 64; i++)

{

temp = pow(2, j);

if (bits[i] == '1')

{

FloatPart = FloatPart + temp;

}

j--;

}

IsxDouble = FloatPart;

if (exp == -1023) {

IsxDouble = 0;

}

if (sign == '1') {

IsxDouble = IsxDouble * -1;

}

return IsxDouble;

}

int main() {

char dmas[64], ucmas[8];

char new_dmas[64], new_ucmas[8];

zero_mas(new_dmas, 64);

zero_mas(new_ucmas, 8);

unsigned char charnum, new_charnum;

double new_doubnum;

int type, hdigit, nbits;

cout << "Please, chose type of input" << endl;

cout << "1: unsigned char" << '\n' << "2: double" << endl;

cin >> type;

if (type == 1) {

cout << "Please write a unsigned char number" << endl;

cin >> charnum;

output_unsigned_char(charnum, ucmas);

while (true) {

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

cout << "Enter the number of the highest digit and the number of bits to make the shift\n";

cout << "\nHighest digit (from 1 to 8): ";

cin >> hdigit;

cout << "\nNumber of bits (from 1 to 8): ";

cin >> nbits;

cout << endl;

if (hdigit >= nbits) break;

else {

cout << "The number of bits must not exceed the number of the highest digit\n";

}

}

make_shift(ucmas, hdigit, nbits, new_ucmas, 8);

print_mas(new_ucmas, 8);

new_charnum = make_unsigned_char(new_ucmas);

cout << new_charnum;

}

else if (type == 2)

{

data_double doublenum;

cout << "Please, write a double number" << endl;

cin >> doublenum.data;

output_double(doublenum, dmas);

while (true) {

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

cout << "Enter the number of the highest digit and the number of bits to make the shift\n"

<< "\nHighest digit (from 1 to 64): ";

cin >> hdigit;

cout << "\nNumber of bits (from 1 to 64): ";

cin >> nbits;

cout << endl;

if (hdigit >= nbits) break;

else {

cout << "The number of bits must not exceed the number of the highest digit\n";

}

}

make_shift(dmas, hdigit, nbits, new_dmas, 64);

print_mas(new_dmas, 64);

new_doubnum = make_double(new_dmas);

cout << new_doubnum;

}

return 0;

}

Б лок схема

Работа программы

Выводы

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

Соседние файлы в папке lab 1