отчетлаба1Середа. Исследование внутреннего представления различных форматов данных
Скачать 0.53 Mb.
|
МИНОБРНАУКИ РОССИИ Санкт-Петербургский государственный электротехнический университет «ЛЭТИ» им. В.И. Ульянова (Ленина) Кафедра МО ЭВМ отчет по лабораторной работе №1 по дисциплине «Организация ЭВМ и систем» Тема: ИССЛЕДОВАНИЕ ВНУТРЕННЕГО ПРЕДСТАВЛЕНИЯ РАЗЛИЧНЫХ ФОРМАТОВ ДАННЫХ
Санкт-Петербург 2016 Цель работы: знакомство с внутренним представлением различных типов данных, используемых компьютером при их обработке. Общие положения При программировании на языке С++ используются 11 стандартных типов данных. Среди них можно выделить 3 группы: 1. данные символьные и целого типа беззнаковые (с фиксированной запятой); 2. данные символьные и целого типа со знаком (с фиксированной запятой), значения которых хранятся в двоичном дополнительном коде; 3. данные вещественного типа (с плавающей запятой (точкой)). Вещественное число в памяти хранится с нормализованной мантиссой, значение которой в десятичном эквиваленте лежит в диапазоне от 1 до 2. Причём 2 не входит в границу диапазона. Если в процессе выполнения какой-либо операции над данными с плавающей запятой значение мантиссы выходит из указанного диапазона, то в конце операции выполняется нормализация результата путем приведения значения мантиссы к указанному диапазону с соответствующим изменением значения порядка. Если значение мантиссы равно нулю или в процессе выполнения операции значение порядка становится меньше допустимой величины, то в результате выполнения операции сформируется так называемый «машинный ноль», то есть код, у которого значение всех бит равно нулю. Но если мантисса всегда нормализована, то старший её бит, то есть единицу, можно и не хранить в памяти. Стандартом предложено это бит не хранить в памяти и тем самым увеличить точность представления вещественных чисел в 2 раза. Эта единица присутствует неявно, то есть, скрыта от глаз наблюдателя и называется неявной единицей (implicit one). Отбрасывание старшей цифры мантиссы выполняется для форматов float и double, но не выполняется для long double. Порядок числа в соответствии с указанным форматом хранится сдвинутым», то есть к его действительному значению добавляется в зависимости от формата такое число, чтобы порядок Р был всегда неотрицательным. Для формата float прибавляется 127, для чисел формата double прибавляется 1023, а для формата long double добавляется 16383. Всегда неотрицательный порядок упрощает выполнение операции сравнения порядков и арифметических операций над ними, а также избавляет от необходимости выделять один бит для хранения знака порядка. Задание: 1. В зависимости от номера варианта задания разработать алгоритм ввода с клавиатуры требуемых типов данных и показатьна экране их внутреннее представление в двоичной системе счисления. 2. Написать и отладить программу на языке С++, реализующую разработанный алгоритм. 3. В соответствии с заданием дополнить разработанный ранее алгоритм блоками для выполнения преобразования двоичного полученного кода исходного типа данных и последующего вывода преобразованного кода в двоичной системе счисления и в формате исходного данного. Вариант №6. Ввод данных short int и double. 6. Выполнить циклический сдвиг в заданную сторону на некоторое вводимое с клавиатуры количество разрядов. Текст программы: // Лабораторная1.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include #include #include #include using namespace std; string FunctionInt2(short int a) { vector while (a != 0) { char ost = a % 2; vector.insert(vector.begin(), ost == 0 ? '0' : '1'); a /= 2; } size_t Length = vector.size(); size_t zero_number = sizeof(short int) * 8 - Length; for (size_t i = 0; i < zero_number; i++) { vector.insert(vector.begin(), '0'); } string result(vector.begin(), vector.end()); return result; } string FunctionDouble(double b) { bool S; if (b > 0) bool S = 0; else S = 1; int cel = floor(b); double drob = b - cel; } int main() { setlocale(LC_ALL, "Russian"); int k = static_cast int x; cout << "Введите число short int"; cin >> x; if ((x > k) || (x < -(k + 1))) cout << "Число выходит за границы диапазона short int"; else cout << FunctionInt2(x)< system("Pause"); return 0; } Примеры запуска программы: Представление short int в двоичном виде и циклический сдвиг Представление double в двоичном виде и циклический сдвиг Контрольные вопросы 1. В каком коде хранятся целые числа со знаком? В дополнительном коде 2. Чем отличаются процессы сдвига влево и вправо для чисел со знаком и беззнаковых? Ничем 3. В каком порядке следует выполнять действия для получения дополнительного кода двоичного целого числа из прямого кода? Побитовая инверсия → Прибавить 1 4. Чем отличается циклический сдвиг двоичного кода от логического сдвига? В циклическом сдвиге на место нового бита встает «вытесненный», а в логическом 0 5. Чем отличается логический сдвиг двоичного кода от арифметического сдвига? При сдвиге вправо в логическом на новое место встает бит, соответствующий знаку 6. Как изменяется значение числа при арифметическом сдвиге на 1 двоичный разряд влево? Умножается на 2 7. Как изменяется значение числа при арифметическом сдвиге на 1 двоичный разряд вправо? Делится на 2 8.В каком порядке следует выполнять действия для получения прямого кода двоичного целого числа из дополнительного кода? Отнять 1 → Побитовая инверсия Структурная схема технических средств |