2017 Холод / ЭВМ 1
.docxМинистерство науки и образования РФ
Федеральное государственное автономное образовательное
учреждение высшего профессионального образования
«Санкт-Петербургский государственный электротехнический
университет «ЛЭТИ» им. В. И. Ульянова (Ленина)»
(СПБГЭТУ «ЛЭТИ»)
Факультет компьютерных технологий и информатики
Кафедра вычислительной техники
Отчет
по лабораторной работе №1
по дисциплине “Организация ЭВМ и систем”
на тему:
“Исследование внутреннего представления различных
форматов данных”
Выполнил:
Студент группы 6307
Лазарев Сергей Олегович
Принял:
к.т.н., доцент
Холод Иван Иванович
Санкт-Петербург 2017
Оглавление
Цель работы 3
1. Задание 3
2. Уточнение задания 3
3. Схема алгоритма 4
4. Текст программы 5
5. Пример запуска программы 7
5. Структура схемы аппаратных средств 8
Цель работы
Исследовать внутреннее представление различных форматов данных.
1. Задание
-
Разработать алгоритм ввода с клавиатуры требуемых типов данных и показать на экране их внутреннее представление в двоичной системе счисления.
2. Написать и отладить программу на языке С++, реализующую
разработанный алгоритм.
3. В соответствии с заданием дополнить разработанный ранее алгоритм
блоками для выполнения преобразования двоичного полученного кода исходного
типа данных и последующего вывода преобразованного кода в двоичной системе счисления и в формате исходного данного.
2. Уточнение задания
Установить в заданные пользователем значения некоторые разряды, количество которых и номера разрядов задаются с клавиатуры.
Использованные структуры:
union Data
{
double x;
unsigned long long y;
};
struct D
{
int* bitPosition = NULL; // указатель на позицию изменяемого бита
int kolvo = 0; // количество бит, которое нужно обработать
int value = 0; // 1 или 0
};
3. Схема алгоритма
Схема алгоритма представлена на рис 1.
Рис 1. Схема алгоритма
4. Текст программы
#include "stdafx.h"
#include <iostream>
#include <locale>
#include <Windows.h>
#include <stdio.h>
using namespace std;
union Data
{
double x;
unsigned long long y;
};
struct D
{
int* bitPosition = NULL;
int kolvo = 0;
int value = 0;
};
template <typename T, typename U>
T bitMaker(T a, struct D data, U f)
{
for(int i = 0; i < data.kolvo; i++)
if (data.value)
a = a | (f << data.bitPosition[i]);
else
a = a & ~(f << data.bitPosition[i]);
return a;
}
struct D enter()
{
struct D data;
cout << "Введите количество разрядов: ";
cin >> data.kolvo;
data.bitPosition = new int[data.kolvo];
for (int i = 0; i < data.kolvo; i++)
{
cout << "Введите " << i + 1 << " разряд: ";
cin >> data.bitPosition[i];
}
cout << "1 или 0: ";
cin >> data.value;
return data;
}
template <typename T, typename U>
void print(T a, int i, U f)
{
for (; i >= 0; i--)
{
if (a & (f << i))
printf("1");
else
printf("0");
}
puts("");
}
int main()
{
setlocale(LC_ALL, "RU");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int digit;
cout << "Введите число Int: ";
cin >> digit;
print(digit, 31, 1);
D dataInt = enter();
system("cls");
cout << endl << " Было Int: ";
print(digit,31, 1);
digit = bitMaker(digit, dataInt, 1);
cout << "Стало Int: ";
print(digit,31, 1);
cout << "New Int: " << digit << endl;
puts("\n\n");
Data data;
cout << "Введите число Double: ";
cin >> data.x;
cout << "Двоичное представление: ";
print(data.y, 63, 1ULL);
D dataD = enter();
cout << endl << " Было Double: ";
print(data.y, 63, 1ULL);
data.y = bitMaker(data.y, dataD, 1ULL);
cout << "Стало Double: ";
print(data.y, 63, 1ULL);
cout << "New Double: " << data.x << endl;
system("pause");
}
5. Пример запуска программы
-
Int:
-
Double:
Рис. 4
5. Структура схемы аппаратных средств
Рис. 3 Внутреннее устройство центрального процессора
Рис. 4 Схема аппаратных средств