
МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра АПУ
отчет
по лабораторной работе №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;
}
Б
лок
схема
Работа программы
Выводы
Получены практические навыки в реализации представления компьютером различных типов данных.