жопа. Лабораторная работа 1 Явное и неявное преобразование типов Цель работы изучение работы компилятора неявного преобразования типов
Скачать 78.5 Kb.
|
Лабораторная работа №1 Явное и неявное преобразование типов Цель работы: изучение работы компилятора неявного преобразования типов. Оборудование и средства: персональный компьютер, компилятор языка программирования C++/Qt. Теоретические сведения Запись выражения на языке программирования может содержать в себе дополнительную информацию, которая при расчёте человеком не имела бы значения, однако для компилятора языка программирования может быть существенной. Если этого не учитывать, то можно получить неожиданные для себя результаты работы программы. Например, арифметическое выражение 15/2 человеком может быть рассчитано как 7 целых и 1 в остатке, то есть 7 целых и 1/2 (либо семь целых пять десятых) что будет являться одним и тем же результатом деления. В случае расчёта программной на языке С++ результат деления будет определён как целочисленный, поскольку язык С++ строго типизированный. Это произойдёт, если не указать явного преобразования типов одним из следующих способов:
Неявное преобразование типов возникает не только с числами вещественными переменными, но и с целочисленными при преобразовании к нужному размеру и знаку. Правила неявного преобразования: тип char приводится к short; short - к int; signed - к unsigned; все целые типы преобразуются к long, а long - к unsigned long; Целое без знака преобразуется к более длинному целому со знаком путём расширения нулём. Целое со знаком преобразуется к более длинному целому со знаком путём размножения знаков. Целое со знаком преобразуется к более короткому целому со знаком путём усечения старших бит. При преобразовании целого со знаком к целому без знака целое со знаком преобразуется к размеру целого без знака и результат интерпретируется как целое без знака. Преобразование целого со знаком к плавающему типу происходит без потери информации, за исключением случая преобразования типа long к float, тогда точность может быть частично потеряна. Величина типа float преобразуется к double без изменения значений. Величины double, преобразованные к float, представляются точно, если это возможно. При преобразовании величины с плавающей точкой к целым типам они сначала преобразуются к типу long, при этом дробная часть отбрасывается, а затем величины типа long преобразуются к требуемому типу. Если значение слишком велико для long, то результат будет не определён (отбрасывается младшая часть мантиссы). Задания 1. Введите следующий код: char t=0xABCD; qDebug()< Запишите результат и объясните его, для этого ответьте на следующие вопросы: Сколько байт в оперативной памяти занимает переменная t? 1 байт. Переменная t после присвоения содержит число со знаком или без знака? Со знаком. Какое из приведённого выше списка правило, привело к полученному результату? 7. «Целое со знаком преобразуется к более короткому целому со знаком путём усечения старших бит.» 2. Заполните таблицу 1. Таблица 1 Неявное преобразование типов данных в С++
3. Введите следующий код: int x; x = 5; x += 1*0.001; qDebug()< 5 //Дробная часть не учитывается. 5.001 = 5. x = 5; x -= 1*0.001; qDebug()< 4 //Дробная часть не учитывается. 4.999 = 4. x = 5; x -= (int)1*0.001; qDebug()< 4 //Дробная часть не учитывается. 4.999 = 4. При умножении - к int преобразуется только 1. x = 5; x -= int(1*0.001); qDebug()< 5 //При умножении - результат преобразуется в int = 0. => 5-0=5. 4. Введите следующий код: double x=1e+5; qDebug()<<(short)x<<(unsigned short)x<<(short)-x<<(unsigned short)-x; Запишите результат и объясните его. 1 2 3 4 -31072 34464 31072 31072 Double x преобразуется в long, далее по типам: усечением старших бит – в short, для unsigned short – еще из short в unsigned short. 5. Для следующего кода: #define PI 3.14159265 for (int i=0;i qDebug()< Заполните таблицу 2. Таблица 2 Точность вычисления вещественных переменных
|