Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование лекции.doc
Скачиваний:
32
Добавлен:
03.12.2018
Размер:
4.85 Mб
Скачать

5.2 Преобразование и приведение типов

Большинство программ на любом языке высокого уровня содержат различные арифметические выражения, значения которых подлежат вычислению. А поскольку язык C# строго типизирован, то программист должен следить за возможностью вычисления этого значения и правильно предугадать и объявить его тип, учитывая явные и неявные преобразования типов языка.

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

Рассмотрим более сложные ситуации.

5.2.1 Присвоение переменной одного типа значения другого типа

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

Например: long h; double z; …..z=h;…. // допустимое преобразование, но может вызвать потерю точности, но не потерю значимости.

Обратное же автоматическое преобразование из double в long недопустимо, потому что оно не является расширяющим.

Невозможны также автоматические преобразования:

  • между decimal и float или double;

  • числовых типов в char или bool;

  • между char и bool.

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

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

Если неявного преобразования из одного типа в другой не существует, програм­мист может задать явное преобразование типа. Явное преобразование типа  это инструкция компилятору преобразовать один тип в другой.

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

Формат операции:

( тип ) выражение

Здесь тип – это имя того типа, в который осуществляется преобразование, а выражение в простейшем случае представляет собой имя переменной, например:

long t = 300;

  1. int z = (int) t; // данные не теряются

  2. byte s = (byte) z; // данные теряются

  3. double z, x; ……int n=(int) (z/x); //теряется дробная часть

При подобных ссужающих преобразованиях типов возможна потеря информации, если преобразуемое значение выходит за границы диапазона целевого типа, так как старшие разряды будут удалены (случай 2, но не случай 1). При приведении типа с плавающей точкой к целому типу будет удалена дробная часть (случай 3).

5.2.3 Преобразование типов в выражениях

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

Правила возможных преобразований представлены на схеме (рис. 5.1), приведенной в своей книге Т.А. Павловской. По схеме легко понять, например, что если один операнд имеет тип decimal,то второй операнд приводится к этому типу. Однако, если второй операнд типа double, это приведет к ошибке, потому что пути пребразования из double в decimal нет. Преобразование выполняется не по­следовательно по схеме, а непосредственно из исходного типа более низкого уровня в результирующий тип.

Рисунок 5.1 Неявные арифметические преобразования типов

Следует помнить, что арифметические операции не определены для более коротких, чем int, типов. Это означает, что если в выражении участвуют только величины типов sbyte, byte, short и ushort, перед выполнением операции они будут преобразованы в int. Таким образом, результат любой арифметической операции имеет тип не менее int.