|
ЭВМ. Лаб1. Отчет по лабораторной работе 1 исследование внутреннего представления различных форматов данных
Текст программы:
// 1.3.cpp: определяет точку входа для консольного приложения.
// #include "stdafx.h"
#include
#include
#include using namespace std; const int F = sizeof(float);
const int D = sizeof(double);
int n;
int N; // номер бита, который нужно изменить
bool m; // значение, на которое нужно изменить указанный бит union
{
float n;
unsigned char C[F];
} Flo; union
{
double n;
unsigned char C[D];
} Dou; void Cel(int n) // вывод числа
{
int i = sizeof(n) * 8 - 1; cout << ((n >> i) & 1) << " ";
--i; for (i; i >= 0; --i)
cout << ((n >> i) & 1);
cout << endl;
} void Izm_Cel() // изменение бита
{
cout << endl << "Какой бит хотите изменить?" << endl << endl;
cin >> N;
cout << "На какой хотите изменить? Введите 0 или 1: ";
cin >> m;
if (m)
n = n | (1 << N);
else
n = n & ((1 << N));
Cel(n);
cout << n;
} void Vech(unsigned char C[], int R, int k) // k = 2 - double, k = 3, float
{
int i = sizeof(C[R - 1]) * 8 - 1;
cout << ((C[R - 1] >> i) & 1) << " "; // выводим первую цифру в 2СС
--i; for (i; i >= 0; --i)
cout << ((C[R - 1] >> i) & 1);
i = sizeof(C[R - 2]) * 8 - 1; if (k == 2)
{
cout << ((C[R - 2] >> i) & 1) << " ";
i--;
}
else
{
for (i; i > 3; --i)
cout << ((C[R - 2] >> i) & 1);
cout << " ";
} for (i; i >= 0; --i)
cout << ((C[R - 2] >> i) & 1); for (int j = R - 3; j >= 0; --j)
{
i = sizeof(C[j]) * 8 - 1; for (i; i >= 0; --i)
cout << ((C[j] >> i) & 1);
}
} void Izm_bitaf(int n)
{
N = N - n * 8; // узнаём номера бита в данном байте
if (m)
Flo.C[n] = Flo.C[n] | (1 << N);
else
Flo.C[n] = Flo.C[n] & ((1 << N));
} void Izm_bita(int n)
{
N = N - n * 8; // узнаём номера бита в данном байте
if (m)
Dou.C[n] = Dou.C[n] | (1 << N);
else
Dou.C[n] = Dou.C[n] & ((1 << N));
} void Izm_Flo() // выясняем, в каком байте находится тот бит, который нужно изменить
{
cout << endl << "Какой бит хотите изменить?" << endl << endl;
cin >> N;
cout << "На какой хотите изменить? Введите 0 или 1: ";
cin >> m;
if (N < 8)
Izm_bitaf(0);
else
{
if (N < 16)
Izm_bitaf(1);
else
{
if (N < 24)
Izm_bitaf(2);
else
Izm_bitaf(3);
}
}
Vech(Flo.C, F, 2);
cout << endl << Flo.n;
} void Izm_Dou() // выясняем, в каком байте находится тот бит, который нужно изменить
{
cout << endl << "Какой бит хотите изменить?" << endl << endl;
cin >> N;
cout << "На какой хотите изменить? Введите 0 или 1: ";
cin >> m;
if (N < 8)
Izm_bita(0);
else
{
if (N < 16)
Izm_bita(1);
else
{
if (N < 24)
Izm_bita(2);
else
{
if (N < 32)
Izm_bita(3);
else
{
if (N < 40)
Izm_bita(4);
else
{
if (N < 48)
Izm_bita(5);
else
{
if (N < 56)
Izm_bita(6);
else
Izm_bita(7);
}
} }
}
}
}
Vech(Dou.C, D, 2);
cout << endl << Dou.n;
}
int main()
{
setlocale(0, "");
bool s = 1;
int k;
do
{
cout << "Выберите тип числа: \n 1. int \n 2. float \n 3. double \n";
cin >> k;
switch (k)
{
case (1):
{
cout << "Введите число: ";
cin >> n;
Cel(n);
Izm_Cel();
}
break;
case (2):
{
cout << "Введите число: ";
cin >> Flo.n;
Vech(Flo.C, F, k);
Izm_Flo();
}
break; case (3):
{
cout << "Введите число: ";
cin >> Dou.n;
Vech(Dou.C, D, k);
Izm_Dou();
}
break;
default:
cout << "Ошибка! Введите 1, 2 или 3!" << endl;
}
cout << endl << "Для продолжения нажмите любую клавишу, для выхода Esc." << endl;
s = (_getch() != 27);
} while (s);
return 0;
}
Примеры запуска программы:
Рис.1 скриншот программы для числа типа int.
Рис.2 скриншот программы для числа типа double.
|
|
|