Явное приведение типов в Си — это приведение любого выбранного типа данных в любой другой тип, задаваемое составителем программы.
Введение
Когда необходимо изменить тип данных на другой, к примеру, большего размера, то можно применять для этого неявный способ преобразования. Иногда начинающие программисты используют следующий метод: float x = 13 / 4;. А так как и четыре и тринадцать являются целыми числами, то никакое приведение (оно же преобразование) типов чисел осуществляться не должно. Просто выполнится процедура деления без остатка тринадцать на четыре, что в результате выдаст итог равный трём. Число три будет преобразовано в формат 3.0, и эта величина будет присвоена переменной х. Это означает, что когда используются числа (к примеру, четыре и тринадцать), то замена одного или двух целых чисел на формат с плавающей точкой (14.0 или 4.0) приведёт к преобразованию их в величины с плавающей точкой, и осуществлению операции деления с плавающей точкой. Например, возможен такой вариант:
ìnt ì1 = 13;
ìnt ì2 = 4;
floàt х = ì1 / ì2;
В результате работы этой программы, переменная х станет равной трём. Для того, чтобы компилятор понимал, что создателю программы нужно выполнить замену деления целых без остатка на деление типа с плавающей точкой, необходимо использовать один из операторов, которые преобразуют типы данных в явной форме.
Явное преобразование типов
В языке программирования С++ существуют такие типы операторов casts, которые выполняют в явном формате преобразование типов данных:
C-stylet;
statìc;
cónst;
C-stylè càst
При написании программ на языке С преобразование типа данных в явном формате выполняется при помощи специального обозначения (). Внутри круглых скобок указывается тип, к которому требуется привести данные. Этот метод изменения типа данных называется C-stylè càst. Ниже приведён пример его практического применения:
ìnt ì1 = 13;
ìnt ì2 = 4;
floàt x = (floàt) ì1 / ì2;
В данном примере значение, заключённое в круглые скобки, даёт задание компилятору на изменение типа переменной i1 (которая имеет тип ìnt) в тип floàt. Но поскольку переменная ì1 приведена к типу floàt, то переменная ì2 преобразуется в автоматическом режиме в тот же тип floàt и деление уже будет осуществлено для данных, имеющих тип с плавающей точкой. Необходимо отметить, что нельзя использовать такой оператор для преобразования данных, имеющих тип cónst, поскольку при этом вероятно появление ошибок.
Оператор static_cast
Применение этого оператора возможно для приведения переменных типа char к типу ìnt. И в этом случае выполняется вывод целого числа, а не символа:
char c = 97;
std::cóut (c)
Данный оператор удобно использовать для приведения фундаментальных типов (одного к другому):
ìnt ì1 = 13;
ìnt ì2 = 4;
float x = statìc_cast(ì1) / ì2;
Основным преимуществом static_cast считается выполнение анализа программы компилятором на наличие ошибок, что исключает возникновение неожиданных проблем. Плюс к этому, оператор static_cast имеет меньшее влияние, по сравнению с оператором C-style cast. Это делает невозможным непреднамеренное преобразование типа const и иные запрещённые действия.
Использование операторов явного преобразования в неявном преобразовании
При применении непроверенных неявных изменений типов данных, компилятор иногда выдаёт сообщения об опасности. Например, следующие:
ìnt ì = 49;
char ch = ì; // приведение неявного типа
Изменение переменной типа ìnt (четыре байта) в тип char (один байт) содержит возможную угрозу, и программа компиляции выдаст предупреждение об этом. Для того, чтобы программа компиляции поняла, что и создатель программы осознаёт вероятную угрозу от этого действия, но это действие всё-таки необходимо исполнить, требуется использовать оператор static_cast:
ìnt ì = 49;
char ch = statìc_cast(ì);
Ниже приведён пример, где компилятор способен сообщить, что приведение double к ìnt может привести к потере данных:
ìnt ì= 90;
ì = ì / 3.6;
Чтобы сообщить программе компиляции о своём решении осуществить действие, нужно использовать следующую форму:
ìnt ì= 90;
ì= statìc_cast(ì / 3.6);
Не рекомендуется без сильной нужды применять приведение типов данных. Очень часто при осуществлении таких действий присутствует возможность возникновения разных осложнений. Но когда это требуется выполнить, рекомендуется использовать statìc_cast, а не C-style cast.
Конвертирование типов в арифметических операциях
Когда при выполнении арифметических операций применяются различные типы величин, компилятор делает попытки в неявном формате привести их к одному типу. И необходимо помнить, когда в программе переменная получает какую-то величину, она в любом случае обязана быть преобразована к типу, соответствующему данной переменной. Например, это можно выполнить таким образом:
char c = 6;
ìnt d = c;
Переменной d, которая имеет тип ìnt, присваивается величина типа char. Поэтому программа компиляции преобразует её величину из типа char в тип ìnt. Но как уже было сказано выше, эти действия способны представлять некую угрозу, поскольку разные типы имеют разное внутреннее представление. И не всегда есть возможность выполнить такие преобразования без искажения информационных данных. Компилятор, когда работает с арифметическими операциями, выполняет такие действия:
- Если первая переменная имеет тип long double, то необходимо и вторую переменную преобразовать в этот тип.
- Если не выполнен первый пункт, и какая-то переменная имеет тип double, тогда и другую переменную обязательно надо преобразовать в тип double.
- Когда не получается исполнить второй пункт и одна из переменных имеет тип long, тогда и вторую переменную необходимо преобразовать к типу long.
- Когда не получилось исполнить пункт три, и какая-то переменная обладает типом unsigned, тогда и вторая переменная должна бути приведена к типу unsigned.