Преобразование типов в выражении.



 

В выражение могут входить операнды различных типов. Если операнды имеют одинаковый тип, то результат операции будет иметь тот же тип. Если операнды разного типа, перед вычислениями выполняются преобразования типов по умолчанию или явно. Преобразования бывают двух видов:

- изменяющие внутреннее представление величин (с потерей точности или без потери точности);

- изменяющие только интерпретацию внутреннего представления.

К первому виду относится, например, преобразование целого числа в вещественное (без потери точности) и наоборот (возможно, с потерей точности), ко второму – преобразование знакового целого в беззнаковое.

По умолчанию преобразование осуществляется по определенным правилам, обеспечивающим преобразование более коротких типов в более длинные для сохранения значимости и точности. На каждом шаге оценки выражения выполняется одна операция, и имеются два операнда. Если их тип различен, операнд меньшего “ранга экстенсивности” приводится к типу более “экстенсивного”. Под экстенсивностью понимается диапазон значений, который поддерживается данным типом. По возрастанию экстенсивности типы следуют в очевидном порядке:

 

char

short

int, long

float

double

long double

 

Ниже приведена последовательность преобразований.

Любые операнды типа char, unsigned char или short преобразуются к типу int по правилам:

- char расширяется нулем или знаком в зависимости от умолчания для char;

- unsigned char расширяется нулем;

- signed char расширяется знаком;

- short, unsigned short при преобразовании не изменяются.

Затем два операнда становятся либо int, либо float, double или long double. Причем, если один из операндов имеет тип float, то другой преобразуется к типу float; если один из операндов имеет тип double, то другой преобразуется к типу double; если один из операндов имеет тип long double, то другой преобразуется к типу long double.

Таким образом операнды преобразуются к типу наиболее длинного из них, и он используется как тип результата (не путать с оператором присваивания).

Кроме того, если в операции участвуют знаковый и беззнаковый целочисленные типы, то знаковый операнд приводится к беззнаковому типу. Результат тоже будет беззнаковым. Во избежание ошибок нужно точно представлять себе, что при этом происходит, и при необходимости применять операцию приведения, явно преобразующую тот или иной операнд.

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

Явное преобразование типа выполняется посредством операции приведения (тип) и может применяться к любому операнду в выражении, например:

 

р = р0 + (int)(pReal + 0.5); // Округление pReal

 

Следует иметь в виду, что операция приведения типа может работать двояким образом. Во-первых, она может производить действительное преобразование данных, как это происходит при приведении целого типа к вещественному и наоборот. Получаются совершенно новые данные, физически отличные от исходных. Во-вторых, операция может никак не воздействовать на имеющиеся данные, а только изменять их интерпретацию. Например, если переменную типа short со значением -1 привести к типу unsigned short, то данные останутся теми же самыми, но будут интерпретироваться по-другому (как целое без знака), в результате чего будет получено значение 65535.

 

 

Задание к лабораторной работе №1

 

Выполните обязательные и непонятные Вам примеры теоретических сведений и лишь затем «задание 1.N» по варианту N (N – номер компьютера).

 

Задание 1.1

 

Создайте консольное приложение, используя для ввода/вывода объекты cin и cout.

Используя созданное консольное, приложение написать программу, в которой:

определяется размер типа int в байтах,

вводятся с клавиатуры значения целых переменных a, b,

вычисляется сумма a и b,

вычисляется остаток от деления a на b,

выполняется операция остаток от деления a на b с присваиванием результата b,

используя условную операцию (?:):

найти минимальное из чисел a и b,

вычислить, если a < b, то a=a/b.

 

Задание 1.2

 

Создайте консольное приложение, используя для ввода/вывода объекты cin и cout.

Использую созданное консольное, приложение написать программу, в которой:

определяется размер типа bool в байтах,

вводятся с клавиатуры значения переменных a, b типа float,

вычисляется разность a и b,

вычисляется частное от деления a на b,

выполняется операция умножение a на b с присваиванием результата a,

используя условную операцию (?:):

найти максимальное из чисел a и b,

вычислить, если a ≤ b, то с=true

 

Задание 1.3

 

Создайте консольное приложение, используя для ввода/вывода объекты cin и cout.

Использую созданное консольное, приложение написать программу, в которой:

определяется размер типа char в байтах,

вводятся с клавиатуры значения переменных a, b типа double,

вычисляется частное от деления a на b,

вычисляется произведение a и b,

выполняется операция сложение a и b с присваиванием значения b,

используя условную операцию (?:):

найти максимальное из чисел a и b,

вычислить, если a ≤ b, то a=a-b

 

Задание 1.4

 

Создайте консольное приложение, используя для ввода/вывода объекты cin и cout.

Использую созданное консольное, приложение написать программу, в которой:

определяется размер типа long int в байтах,

вводятся с клавиатуры значения целых переменных a, b,

вычисляется частное от деления a на b,

вычисляется остаток от деления a на b,

выполняется операция остаток от деления a на b с присваиванием значения b,

используя условную операцию (?:):

найти минимальное из чисел a и b,

вычислить, если a ≥ b, то b=a-b

 

Задание 1.5

 

Создайте консольное приложение, используя для ввода/вывода объекты cin и cout.

Использую созданное консольное, приложение написать программу, в которой:

определяется размер типа unsigned char в байтах,

вводятся с клавиатуры значения переменных a, b типа float,

вычисляется разность a и b,

вычисляется частное от деления a на b,

выполняется операция умножение a на b с присваиванием значения b,

используя условную операцию (?:):

найти минимальное из чисел a и b,

вычислить, если a > b, то a=a+b,

 

Задание 1.6

 

Создайте консольное приложение, используя для ввода/вывода объекты cin и cout.

Использую созданное консольное, приложение написать программу, в которой:

определяется размер типа short int в байтах,

вводятся с клавиатуры значения целых переменных a, b,

вычисляется остаток от деления a на b,

вычисляется произведение a и b,

выполняется операция деление a на b с присваиванием значения a,

используя условную операцию (?:):

найти максимальное из чисел a и b,

вычислить, если a < b, то с= false

 

Задание 1.7

 

Создайте консольное приложение, используя для ввода/вывода объекты cin и cout.

Использую созданное консольное, приложение написать программу, в которой:

определяется размер типа double в байтах,

вводятся с клавиатуры значения целых переменных a, b,

вычисляется остаток от деления a на b,

вычисляется произведение a и b,

выполняется операция деление a на b с присваиванием значения a,

используя условную операцию (?:):

найти минимальное из чисел a и b,

вычислить, если a ≤ b, то с= false

 

Задание 1.8

 

Создайте консольное приложение, используя для ввода/вывода объекты cin и cout.

Использую созданное консольное, приложение написать программу, в которой:

определяется размер типа long double в байтах,

вводятся с клавиатуры значения переменных a, b типа float,

вычисляется разность a и b,

вычисляется частное от деления a на b,

выполняется операция умножение a на b с присваиванием значения b,

используя условную операцию (?:):

найти максимальное из чисел a и b,

вычислить, если a ≥ b, то с= false

 

Задание 1.9

 

Создайте консольное приложение, используя для ввода/вывода объекты cin и cout.

Использую созданное консольное, приложение написать программу, в которой:

определяется размер типа float в байтах,

вводятся с клавиатуры значения переменных a, b типа double,

вычисляется сумма a и b,

вычисляется произведение a и b,

выполняется операция деление a на b с присваиванием значения a,

используя условную операцию (?:):

найти минимальное из чисел a и b,

вычислить, если a > b, то с=false

 

Задание 1.10

 

Создайте консольное приложение, используя для ввода/вывода объекты cin и cout.

Использую созданное консольное, приложение написать программу, в которой:

определяется размер типа long int в байтах,

вводятся с клавиатуры значения переменных a, b типа long int,

вычисляется разность a и b,

вычисляется остаток от деления a на b,

выполняется операция деление a на b с присваиванием значения b,

используя условную операцию (?:):

найти максимальное из чисел a и b,

вычислить, если a < b, то с=true

 

Контрольные вопросы к лабораторной работе №1

 

1. Продемонстрируйте создание консольного приложения.

2. Как установить точку останова в программе и что она означает ?

3. Какие кнопки клавиатуры соответствуют пошаговому выполнению программы и выполнению программы до заданной строки ?

4. Как прервать выполнение программы, которая «зависла» (долго не выдает никаких сообщений) ?

5. Что такое идентификатор, ключевое слово ?

6. Приведите примеры литеральной константы: целой, вещественной, символьной, строковой.

7. Как вводится комментарий в программе ?

8. Дайте характеристику основным типам данных.

9. Что такое описание, определение, объявление, инициализация переменных ?

10. Что такое область действия и область видимости переменной ?

11. Какая переменная называется глобальной и какая локальной ?

12. Дайте характеристику классам памяти: auto, static, register, volatile ?

13. Как осуществляется форматирование вывода данных с помощью функции printf и объекта cout ?

14. Как осуществить ввод данных с помощью функции scanf и объекта cin ?

15. Запишите и объясните смысл одной из операций п. 2.10.

16. Запишите типы данных в порядке возрастания экстенсивности. Как используется этот порядок при преобразовании типа ?

 


 

ГЛАВА 2

 


Дата добавления: 2018-11-24; просмотров: 311; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!