Справочник от Автор24
Найди эксперта для помощи в учебе
Найти эксперта
+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, поскольку при этом вероятно появление ошибок.

«Явное приведение типов в Си» 👇
Помощь эксперта по теме работы
Найти эксперта
Решение задач от ИИ за 2 минуты
Решить задачу
Найди решение своей задачи среди 1 000 000 ответов
Найти

Оператор 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
Найди решение своей задачи среди 1 000 000 ответов
Крупнейшая русскоязычная библиотека студенческих решенных задач
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot