Справочник от Автор24
Нужна помощь?
Найдем эксперта за 5 минут
Подобрать эксперта
+2

Явное приведение типов в Си

Срочно нужна работа?
Мы готовы помочь!
Найти эксперта
Определение 1

Явное приведение типов в Си — это приведение любого выбранного типа данных в любой другой тип, задаваемое составителем программы.

Введение

Когда необходимо изменить тип данных на другой, к примеру, большего размера, то можно применять для этого неявный способ преобразования. Иногда начинающие программисты используют следующий метод: 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. Но как уже было сказано выше, эти действия способны представлять некую угрозу, поскольку разные типы имеют разное внутреннее представление. И не всегда есть возможность выполнить такие преобразования без искажения информационных данных. Компилятор, когда работает с арифметическими операциями, выполняет такие действия:

  1. Если первая переменная имеет тип long double, то необходимо и вторую переменную преобразовать в этот тип.
  2. Если не выполнен первый пункт, и какая-то переменная имеет тип double, тогда и другую переменную обязательно надо преобразовать в тип double.
  3. Когда не получается исполнить второй пункт и одна из переменных имеет тип long, тогда и вторую переменную необходимо преобразовать к типу long.
  4. Когда не получилось исполнить пункт три, и какая-то переменная обладает типом unsigned, тогда и вторая переменная должна бути приведена к типу unsigned.
Срочно нужна работа?
Мы готовы помочь!
Найти эксперта
Дата написания статьи: 29.01.2020