1 лаба
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра вычислительной техники
отчет
по лабораторной работе №1
по дисциплине «Организация ЭВМ и систем»
Тема: Исследование внутреннего представления различных форматов данных
Студенты гр. 1363 |
|
Соловьев М.И. Владимиров П.А. |
Преподаватель |
|
Гречухин М.Н. |
Санкт-Петербург
2022
Цель работы: знакомство с внутренним представлением различных типов данных, используемых компьютером при их обработке.
Задание: разработать алгоритм ввода с клавиатуры требуемых типов данных и показать на экране их внутреннее представление в двоичной системе счисления. Написать и отладить программу на языке С++, реализующую разработанный алгоритм. В соответствии с заданием дополнить разработанный ранее алгоритм блоками для выполнения преобразования двоичного полученного кода исходного типа данных и последующего вывода преобразованного кода в двоичной системе счисления и в формате исходного данного.
Блок-схема алгоритма
Б лок-схема для 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
Структурная схема аппаратных средств, используемых при выполнении программы с необходимой степенью детализации содержимого блоков.
Монитор (устройство вывода)
Клавиатура (устройство ввода)
ОЗУ
Системная шина
Устройство ввода
Устройство вывода
ЦП
Оперативная память (ОЗУ)
Центральный процессор