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

1 лаба

.docx
Скачиваний:
44
Добавлен:
17.03.2023
Размер:
681.77 Кб
Скачать

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

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

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

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

Кафедра вычислительной техники

отчет

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

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

Тема: Исследование внутреннего представления различных форматов данных

Студенты гр. 1363

Соловьев М.И. Владимиров П.А.

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

Гречухин М.Н.

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

2022

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

Задание: разработать алгоритм ввода с клавиатуры требуемых типов данных и показать на экране их внутреннее представление в двоичной системе счисления. Написать и отладить программу на языке С++, реализующую разработанный алгоритм. В соответствии с заданием дополнить разработанный ранее алгоритм блоками для выполнения преобразования двоичного полученного кода исходного типа данных и последующего вывода преобразованного кода в двоичной системе счисления и в формате исходного данного.

Блок-схема алгоритма

  1. Б лок-схема для 1 задания

  1. Блок-схема для 2 задания

Текст программы

#include<iostream>

#include<stdlib.h>

#include<vector>

using namespace std;

typedef union {

double x;

char bits[sizeof(double)];

} DOUBLE;

void getBitRepresentation(int64_t* x) {

for (int i = sizeof(int64_t) * 8; i > 0; i--)

{

if (i % 8 == 0 && i != sizeof(int64_t) * 8) {

cout << " ";

}

if (*x & (1i64 << (i - 1))) {

cout << "1";

}

else {

cout << "0";

}

}

cout << endl;

}

void getBitRepresentation(unsigned int* x) {

for (int i = sizeof(unsigned int) * 8; i > 0; i--)

{

if (i % 8 == 0 && i != sizeof(unsigned int) * 8) {

cout << " ";

}

if (*x & (1 << (i - 1))) {

cout << "1";

}

else {

cout << "0";

}

}

cout << endl;

}

void getBitRepresentation(DOUBLE D) {

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

{

for (size_t j = 8; j > 0; j--)

{

if (D.bits[i-1] & 1 << j - 1) {

cout << "1";

}

else {

cout << "0";

}

}

cout <<" ";

}

cout << endl;

}

void changeBits(unsigned int* num, int pos, int k, int b) {

if (pos > 63 pos < 0) {

cout << "Error" << endl;

return;

}

if (pos + k > 64) {

cout << "Error" << endl;

}

getBitRepresentation(num);

for (size_t i = 0; i < k; i++)

{

if ((*num & (1 << (pos + i))) > 0 && b == 0) {

*num = *num ^ 1 << (pos + i);

}

if ((*num & (1 << (pos + i ))) == 0 && b == 1) {

*num = *num ^ 1 << (pos + i);

}

}

getBitRepresentation(num);

cout << *num << endl;

};

void changeBits(int64_t* num, int pos, int k, int b) {

if (pos > 63 pos < 0) {

cout << "Error" << endl;

return;

}

if (pos + k > 64) {

cout << "Error" << endl;

}

getBitRepresentation(num);

cout << *(double*)num << endl;

for (size_t i = 0; i < k; i++)

{

if ((*num & (1i64 << (pos + i))) > 0 && b == 0) {

*num = *num ^ 1i64 << (pos + i);

}

if ((*num & (1i64 << (pos + i ))) == 0 && b == 1) {

*num = *num ^ 1i64 << (pos + i);

}

}

cout << *(double*)num << endl;

getBitRepresentation(num);

};

int main() {

cout << "Bit representation of what of type would you like to get? Type 1 for double, 2 for unsigned int" << endl;

int type;

cin >> type;

if (type == 1) {

double d;

cout << "Enter number" << endl;

cin >> d;

getBitRepresentation((int64_t*)&d);

}

else if (type == 2) {

unsigned int i;

cout << "Enter number" << endl;

cin >> i;

getBitRepresentation(&i);

}

else {

cout << "Wrong type" << endl;

return 1;

}

cout << "Next task" << endl;

cout << "Enter number in which you would like to change bits. Type 1 for double, 2 for unsigned int" << endl;

cin >> type;

if (type == 1) {

double d;

cout << "Enter number" << endl;

cin >> d;

cout << "Enter position of 1st bit to change (numbering starts from right)" << endl;

int pos;

cin >> pos;

int num;

cout << "Enter how many bits do you wanna change?" << endl;

cin >> num;

cout << "Enter bit" << endl;

int b;

cin >> b;

changeBits((int64_t*) & d, pos,num,b);

return 0;

}

else if (type == 2) {

unsigned int i;

cout << "Enter number" << endl;

cin >> i;

cout << "Enter position of 1st bit to change (numbering starts from right)" << endl;

int pos;

vector <int> bits;

cin >> pos;

int num;

cout << "Enter how many bits do you wanna change?" << endl;

cin >> num;

int b;

cout << "Enter bit" << endl;

cin >> b;

changeBits(&i, pos, num, b);

return 0;

}

else {

cout << "Error, wrong type" << endl;

return 1;

}

}

Примеры запуска программы

Рисунок 1 – Тип double

Рисунок 2 – Тип unsigned int

Структурная схема аппаратных средств, используемых при выполнении программы с необходимой степенью детализации содержимого блоков.

  1. Монитор (устройство вывода)

  2. Клавиатура (устройство ввода)

    ОЗУ

    Системная шина

    Устройство ввода

    Устройство вывода

    ЦП

  3. Оперативная память (ОЗУ)

  4. Центральный процессор

Соседние файлы в предмете Организация ЭВМ