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

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

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

Как известно, есть 2 вида преобразования типа – неявное и явное. Первый вариант означает, что компилятор при считывании кода изменяет тип самостоятельно. Для примера

Программа сама меняет тип i на float и суммирует 2 числа. Тип меняется только для этой функции.

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

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

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

которая напоминает функцию printf, но печатает не на экран, а в строку buffer, или встроенными функциями компилятора.

Для примера, в компиляторе Borland перевод из int в char* имеет вид char* itoa(int value, char* string, int radix). Параметры этой функции: value – исходное число, string – возвращаемая строка, radix – система счисления (для десятичной системы счисления radix = 10).

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

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

Обновл. 30 Дек 2019 |

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

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

Разные типы данных могут представлять одно значение по-разному, например, значение 4 типа int и значение 4.0 типа float хранятся как совершенно разные двоичные шаблоны.

И как вы думаете, что произойдёт, если сделать следующее:

Здесь компилятор не сможет просто скопировать биты со значения 4 типа int и переместить их в переменную f типа float. Вместо этого ему нужно будет преобразовать целое число 4 в число типа с плавающей точкой, которое затем можно будет присвоить переменной f.

Читайте также:  Спишите предложения вставляя вместо вопросов подходящие слова

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

Присваивание или инициализация переменной значением другого типа данных:

Передача значения в функцию, где тип параметра — другой:

Возврат из функции, где тип возвращаемого значения — другой:

Использование бинарного оператора с операндами разных типов:

Во всех этих случаях (и во многих других) C++ будет использовать преобразование типов.

Есть два основных способа преобразования типов:

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

Явное преобразование типов, когда разработчик использует один из операторов casts для выполнения конвертации объекта из одного типа данных в другой.

Неявное преобразование типов

Неявное преобразование типа (или ещё «автоматическое преобразование типа») выполняется всякий раз, когда требуется один фундаментальный тип данных, но предоставляется другой, и пользователь не указывает компилятору, как выполнить конвертацию (не использует явное преобразование типов через операторы casts).

Есть два основных типа неявного преобразования типов:

Числовое расширение

Когда значение из одного типа данных конвертируется в другой тип данных побольше (по размеру и по диапазону значений), то это называется числовым расширением. Например, int может быть расширен в long, а float может быть расширен в double:

В C++ есть два типа расширений:

Интегральное расширение (или ещё «целочисленное расширение»). Включает в себя преобразование целочисленных типов, меньших, чем int (bool, char, unsigned char, signed char, unsigned short, signed short) в int (если это возможно) или unsigned int.

Расширение типа с плавающей точкой. Конвертация из float в double.

Интегральное расширение и расширение типа с плавающей точкой используются для преобразования «меньших по размеру» типов данных в типы int/unsigned int или double (они наиболее эффективны для выполнения разных операций).

Читайте также:  Заказ контента 9190 билайн что это такое

Важно: Числовые расширения всегда безопасны и не приводят к потере данных.

Числовые конверсии

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

Всем доброго времени суток, на связи Алексей Гулынин. В прошлой статье мы узнали, что такое .NET Framework. В данной статье я бы хотел поговорить про явное и неявное преобразование в C#. C# является строго типизированным языком. Тип переменной нужно указывать при её инициализации. Иногда возникает необходимость преобразовать переменную в другой тип. В C# существует явное и неявное преобразование типов ( implicitly convert ). Неявное преобразование характерно, в основном, для числовых типов: byte, short, int, long, float, double . Как это понимать? Тип данных byte неявно преобразовывается в типы данных short, int ,long . Тип данных short неявно преобразовывается в типы данных int, long . Int неявно преобразовывается в long, float неявно преобразовывается в double . А в double вообще все эти типы неявно преобразовываются.

Давайте на примере разберем неявное преобразование типов:

Почему такое преобразование возможно. Ответ кроется в том, что диапазон значений long перекрывает int (т.е. в long можно записать значение любого int ), диапазон значений short перекрывает byte и т.д.

Здесь мы видим, что преобразование прошло и сообщения выводятся. Однако обратное преобразование не работает, т.е. long неявно не преобразовывается в int , short в byte и т.д. При попытке выполнить такое преобразование компилятор поругается:

Компилятор говорит, "что неявное преобразование short в byte невозможно. Явное преобразование существует (вы пропустили cast?)". На этапе компиляции компилятор не знает, какое значение будет храниться в переменных b (типа byte) и s (типа short) , а не всякое число типа short можно положить в byte . Можно написать такое значение short , которое не влезет в byte .

Читайте также:  Символы в алгебре логики

Поэтому и выходит ошибка на этапе компиляции.

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

Существует ещё один способ преобразования данных с помощью класса Convert , в котором есть много статических методов (с префиксом To ). Данные статические методы выполняют преобразования. Переделаем предыдущий пример:

Здесь я добавил преобразование long в int . Тут есть несколько статических методов: ToInt16(), ToInt32(), ToInt64() . Разберем, что значат эти цифры на примере метода ToInt32 . Тип данных int занимает 4 байта (нам и нужно для хранения этой переменной 4 байта), а это 32 бита (4 байта * 8(в одном байте 8 битов) = 32 бита).

Также отмечу, что существует универсальный метод ToString() , который любой тип данных переводит в строку. А что если мы хотим строку перевести в число? Это требуется тогда, когда пользователь что-то вводит. Здесь поможет метод Parse . Рассмотрим на примере:

Всё хорошо, но если пользователь введёт не число, а какую-нибудь ерунду, то программа аварийно завершится. Чтобы этого не произошло воспользуемся методом TryParse() . Данный метод проверяет возможно ли выполнить преобразование, и если возможно, то возвращает истину. Переделаем наш код:

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

В данной статье вы узнали, что такое конструкторы в C#.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.

Ссылка на основную публикацию
Шум в радиаторах отопления как устранить
Отопительная система конструктивно очень сложна, а от ее функционирования зависит уровень комфорта всех жильцов дома. Когда монтажом отопления занимаются профессионалы,...
Что значит код ошибки 805а8011
Многие владельцы смартфонов с операционной системой Windows Phone не могут войти в учетную запись магазина Marketplace. На экране появляется код...
Что значит интегрированный процессор
Здравствуйте, уважаемые пользователи и любители компьютерного железа. Сегодня порассуждаем на тему, что такое интегрированная графика в процессоре, зачем она вообще...
Шутеры по локальной сети на андроид
Перемещайтесь по многочисленным картам игры и уничтожайте врагов с помощью различного оружия. v4.2 + Мод: много денег Великолепная аркада с...
Adblock detector