Справочник от Автор24
Найди эксперта для помощи в учебе
Найти эксперта
+2

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

Определение 1

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

Введение

Если требуется поменять тип данных на иной, например, больший по размеру, то возможно использовать для этой цели неявный метод преобразования. Некоторые неопытные программисты иногда применяют такой вариант: float x = 11 / 3;. Но поскольку и одиннадцать и три, это целочисленные величины, то никакие преобразования типов чисел выполняться не будет. Будет выполнена операция деления без остатка одиннадцать на три, что даст в итоге три. Тройка пройдёт преобразование в вид 3.0 и это значение получит переменная х. То есть, если применяются числовые символы (например, одиннадцать или три), то подмена первого или пары целых чисел на значения с плавающей точкой (11.0 или 3.0) ведёт к преобразованию их в значении вида с плавающей точкой и выполнению деления типа с плавающей точкой. Оптимально в таком случае использовать переменные.

К примеру, так:

1 int i1 = 11;

2 int i2 = 3;

3 float x = i1 / i2;

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

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

В программном языке С++ имеется следующие типы операторов casts, выполняющих в явной форме изменение типов данных:

C-stylet;

static;

const;

C-style cast.

В программах на языке С изменение в явной форме типа данных осуществляется посредством специального обозначения (). Внутрь скобок заносится тип, в который необходимо преобразовать данные. Такой способ перемены типа данных носит название C-style cast. Применять можно, например, так:

1 int i1 = 11;

2 int i2 = 3;

3 float x = (float)i1 / i2;

В этом примере содержимое внутри скобок сообщает программе компиляции, что надо выполнить изменение переменной i1 (типа int) в тип float. Так как i1 теперь имеет тип float, то i2 тоже будет автоматом преобразовано в такой же тип, и операция деления уже будет выполнена для типа данных с плавающей точкой. Следует заметить, не стоит применять данный оператор для изменения данных типов const, так как это может привести к ошибкам.

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

Оператор static_cast

Этот оператор может применяться для конвертирования переменной типа char в тип int, при этом выводится целое число, а не символ:

Код. Автор24 — интернет-биржа студенческих работ

Рисунок 1. Код. Автор24 — интернет-биржа студенческих работ

Этот оператор оптимально применять для преобразования фундаментальных типов(один в другой):

1 int i1 = 11;

2 int i2 = 3;

3 float x = static_cast (i1) / i2;

Главным достоинством static_cast может считаться наличие проверки программой компиляции на ошибки, что предотвращает появление непредсказуемых проблем. Кроме того, оператор static_cast обладает меньшим влиянием, чем оператор C-style cast. Это исключает возможность случайного изменения типа const и другие бессмысленные операции.

Использование операторов явного преобразования в неявном преобразовании

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

1 int i = 49;

2 char ch = i; // неявное преобразование

Преобразование переменной типа int (4 байта) в тип char (1 байт) несёт потенциальную опасность, и компилятор об этом предупредит. Чтобы компилятор понял, что программист понимает потенциальную опасность операции, но её надо всё равно выполнить, следует применять оператор static_cast:

Код. Автор24 — интернет-биржа студенческих работ

Рисунок 2. Код. Автор24 — интернет-биржа студенческих работ

В примере ниже, программа компиляции может выдать сообщение, что преобразование из double в int способно спровоцировать потерю данных:

1 int i = 90;

2 i = i / 3.6;

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

Код. Автор24 — интернет-биржа студенческих работ

Рисунок 3. Код. Автор24 — интернет-биржа студенческих работ

Не следует использовать без крайней необходимости конвертацию типов данных. Почти всегда при выполнении этих преобразований существует вероятность появления различных проблем. Но если это всё-таки необходимо сделать, лучше применять static_cast вместо C-style cast.

Конвертирование типов в арифметических операциях

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

1 char c = 6;

2 int d = c;

Переменная d, представляющая тип int, получает значение типа char. По этой причине компилятор приведёт её значение от типа char к типу int. Как отмечалось выше, такие преобразования могут нести потенциальную опасность, так как различные типы обладают различным внутренним представлением. И без потерь данных изменение типа представления не всегда можно осуществить. Программа компиляции при арифметических операциях делает следующие преобразования:

  1. Когда одна из переменных обладает типом long double, то и вторая переменная должна быть приведена к этому типу.
  2. Когда пункт один не исполнен и одна из переменных обладает типом double, то вторая переменная так же должна быть приведена к типу double.
  3. Если не удалось выполнить пункт выше, и какая-либо переменная обладает типом long, то вторая переменная так же преобразуется в тип long.
  4. Если снова не произошло выполнение предыдущего пункта и одна из переменных является типа unsigned, то другая переменная так же преобразуется в тип unsigned.
  5. Когда не выполнен предыдущий пункт, обе переменные преобразуются к типу int.

Приведём пример:

1 int a = 10;

2 double b = 4;

3 double c = a + b; // 14.000000

В формуле a + b переменная b имеет тип double, по этой причине переменная a так же в автомате преобразуется к типу double. Итог арифметической операции сложения также станет типа double.

Дата написания статьи: 25.11.2019
Найди решение своей задачи среди 1 000 000 ответов
Крупнейшая русскоязычная библиотека студенческих решенных задач
Все самое важное и интересное в Telegram

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

Перейти в Telegram Bot