Главная страница
Навигация по странице:

  • Оборудование и средства

  • Правила неявного преобразования

  • жопа. Лабораторная работа 1 Явное и неявное преобразование типов Цель работы изучение работы компилятора неявного преобразования типов


    Скачать 78.5 Kb.
    НазваниеЛабораторная работа 1 Явное и неявное преобразование типов Цель работы изучение работы компилятора неявного преобразования типов
    Дата07.10.2021
    Размер78.5 Kb.
    Формат файлаdoc
    Имя файлажопа.doc
    ТипЛабораторная работа
    #242913

    Лабораторная работа №1

    Явное и неявное преобразование типов

    Цель работы: изучение работы компилятора неявного преобразования типов.

    Оборудование и средства: персональный компьютер, компилятор языка программирования C++/Qt.

    Теоретические сведения

    Запись выражения на языке программирования может содержать в себе дополнительную информацию, которая при расчёте человеком не имела бы значения, однако для компилятора языка программирования может быть существенной. Если этого не учитывать, то можно получить неожиданные для себя результаты работы программы.

    Например, арифметическое выражение 15/2 человеком может быть рассчитано как 7 целых и 1 в остатке, то есть 7 целых и 1/2 (либо семь целых пять десятых) что будет являться одним и тем же результатом деления.

    В случае расчёта программной на языке С++ результат деления будет определён как целочисленный, поскольку язык С++ строго типизированный. Это произойдёт, если не указать явного преобразования типов одним из следующих способов:

    Преобразование

    Пример

    Указание числом

    15.0/2

    Использование имени типа

    float(15)/0

    или

    (float)15/0

    Использование унарной операции static_cast(/*переменная или число*/)

    static_cast(15)/2


    Неявное преобразование типов возникает не только с числами вещественными переменными, но и с целочисленными при преобразовании к нужному размеру и знаку.

    Правила неявного преобразования:

    1. тип char приводится к short;

    2. short - к int;

    3. signed - к unsigned;

    4. все целые типы преобразуются к long, а long - к unsigned long;

    5. Целое без знака преобразуется к более длинному целому со знаком путём расширения нулём.

    6. Целое со знаком преобразуется к более длинному целому со знаком путём размножения знаков.

    7. Целое со знаком преобразуется к более короткому целому со знаком путём усечения старших бит.

    8. При преобразовании целого со знаком к целому без знака целое со знаком преобразуется к размеру целого без знака и результат интерпретируется как целое без знака.

    9. Преобразование целого со знаком к плавающему типу происходит без потери информации, за исключением случая преобразования типа long к float, тогда точность может быть частично потеряна.

    10. Величина типа float преобразуется к double без изменения значений. Величины double, преобразованные к float, представляются точно, если это возможно.

    11. При преобразовании величины с плавающей точкой к целым типам они сначала преобразуются к типу long, при этом дробная часть отбрасывается, а затем величины типа long преобразуются к требуемому типу. Если значение слишком велико для long, то результат будет не определён (отбрасывается младшая часть мантиссы).

    Задания

    1. Введите следующий код:

    char t=0xABCD;

    qDebug()<
    Запишите результат и объясните его, для этого ответьте на следующие вопросы:

    1. Сколько байт в оперативной памяти занимает переменная t?

    1 байт.

    1. Переменная t после присвоения содержит число со знаком или без знака?

    Со знаком.

    1. Какое из приведённого выше списка правило, привело к полученному результату?

    7. «Целое со знаком преобразуется к более короткому целому со знаком путём усечения старших бит.»

    2. Заполните таблицу 1.

    Таблица 1

    Неявное преобразование типов данных в С++




    x=15

    y=2

    z=x/y

    Результат



    делимое

    делитель

    частное




    1

    int

    int

    int

    7

    2

    int

    int

    float

    7

    3

    int

    float

    float

    7.5

    4

    float

    int

    float

    7.5



    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

    x=0;

    for (int i=0;i
    qDebug()<
    Заполните таблицу 2.

    Таблица 2

    Точность вычисления вещественных переменных

    n

    =float

    =double

    100

    100

    100

    1000

    1000

    1000

    10000

    9998.54

    10000

    100000

    100053

    100000

    1000000

    1009100

    1000000

    10000000

    11057900

    10000000


    написать администратору сайта