1. Исследование внутреннего представления различных форматов данных
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РФ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
отчЁт
по лабораторной работе №1
по дисциплине «Организация ЭВМ и систем»
Тема: Исследование внутреннего представления различных форматов данных
Студент гр. 9300 |
ФИО |
Преподаватель |
Лебедев С. В. |
Санкт-Петербург
2020
Задание.
Разработать алгоритм ввода с клавиатуры типов данных unsigned long и float и показать на экране их внутреннее представление в двоичной системе счисления. Преобразовать полученный двоичный код, поменяв местами значения рядом стоящих бит в парах. Количество пар и номер старшего разряда левой пары задаётся с клавиатуры. Вывести преобразованный код в двоичной системе счисления и в исходном формате.
Блок-схема алгоритма.
Рисунок 1. Блок-схема для одного числа.
Текст программы.
#include <iostream> unsigned pairsHigh; unsigned pairsCount; void printBinary(unsigned size, unsigned long value) { for (unsigned i = 8 * size; i > 0; --i) { std::cout << bool(value & (1ul << (i - 1))); } std::cout << std::endl; } void swapBits(unsigned long &value) { for (unsigned i = 0; i < pairsCount; ++i) { unsigned offset = pairsHigh - i * 2; bool tmp = value & (1ul << offset); if (value & (1ul << (offset - 1))) value |= 1ul << offset; else value &= ~(1ul << offset); if (tmp) value |= 1ul << (offset - 1); else value &= ~(1ul << (offset - 1)); } } void pairInputs(unsigned size) { std::cout << "Enter pairs high bit: "; std::cin >> pairsHigh; while (pairsHigh >= 8 * size || pairsHigh <= 0) { std::cout << "Invalid value. Enter other pairs high bit: "; std::cin >> pairsHigh; } std::cout << "Enter pairs count: "; std::cin >> pairsCount; while (pairsHigh + 1 < pairsCount * 2 || pairsCount <= 0) { std::cout << "Invalid value. Enter other pairs count: "; std::cin >> pairsCount; } } int main() { // Unsigned Long unsigned long a; std::cout << "Enter an unsigned long number: "; std::cin >> a; std::cout << "Binary: "; printBinary(sizeof(a), a); pairInputs(sizeof(a)); swapBits(a); std::cout << "Binary: "; printBinary(sizeof(a), a); std::cout << "Regular: " << a << std::endl; // Float union{ unsigned long ul = 0; float f; }; std::cout << "Enter a float number: "; std::cin >> f; std::cout << "Binary: "; printBinary(sizeof(f), ul); pairInputs(sizeof(f)); swapBits(ul); std::cout << "Binary: "; printBinary(sizeof(f), ul); std::cout << "Regular: " << f << std::endl; char pause; std::cin >> pause; return 0; }
Примеры запуска программы.
Пример 1.
Enter an unsigned long number: 133 Binary: 0000000000000000000000000000000000000000000000000000000010000101 Enter pairs high bit: 3 Enter pairs count: 1 Binary: 0000000000000000000000000000000000000000000000000000000010001001 Regular: 137 Enter a float number: 3.14 Binary: 01000000010010001111010111000011 Enter pairs high bit: 10 Enter pairs count: 1 Binary: 01000000010010001111001111000011 Regular: 3.13988 |
Пример 2.
Enter an unsigned long number: 128 Binary: 0000000000000000000000000000000000000000000000000000000010000000 Enter pairs high bit: 1000 Invalid value. Enter other pairs high bit: 8 Enter pairs count: 1 Binary: 0000000000000000000000000000000000000000000000000000000100000000 Regular: 256 Enter a float number: -3.14 Binary: 11000000010010001111010111000011 Enter pairs high bit: 22 Enter pairs count: 11 Binary: 11000000001100010110101110100101 Regular: -2.7722 |
Структурная схема аппаратных средств.
Рисунок 2. Структурная схема аппаратных средств, используемых при выполнении программы.
Вывод.
Было изучено внутреннее представление целочисленных и вещественных типов данных, разработан алгоритм, показывающий внутреннее представление чисел типов unsigned long и float в двоичной системе счисления.