Как поменять тип переменной в c
Перейти к содержимому

Как поменять тип переменной в c

Как поменять тип переменной в c

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

Переменной d, которая представляет тип int, присваивается значение типа char, поэтому компилятор выполняет приведение значения от типа char к типу int.

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

Рассмотрим, какие преобразования применяет компилятор при арифметических операциях:

Если один из операндов имеет тип long double , то второй операнд тоже будет преобразован в тип long double

Если предыдущий пункт не выполняется и если один из операндов имеет тип double , то второй операнд тоже будет преобразован к типу double

Если предыдущий пункт не выполняется и если один из операндов имеет тип float , то второй операнд тоже будет преобразован к типу float

Если предыдущий пункт не выполняется и если один из операндов имеет тип unsigned long int , то второй операнд тоже будет преобразован к типу unsigned long int

Если предыдущий пункт не выполняется и если один из операндов имеет тип long , то второй операнд тоже будет преобразован к типу long

Если предыдущий пункт не выполняется и если один из операндов имеет тип unsigned , то второй операнд тоже будет преобразован к типу unsigned

Если предыдущий пункт не выполняется то оба операнда приводятся к типу int

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

Операция преобразования

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

В выражении int c = a / b; результат деления будет целочисленный — 2, при котором дробная часть будет отброшена, так как оба операнда операции представляют целые числа.

В выражении double d = a / b; результат деления будет представлять вещественное число — 2.00000, но так как оба операнда являются целыми числами, то опять же результат операции будет представлять целое число 2, и только поле выполнения деления произойдет присвоение результата переменной d с приведением значения 2 от типа int к типу double.

В выражении double e = (double)a / (double)b применяется явное преобразование данных к типу double, поэтому и результат деления будет представлять вещественное число — 2.50000.

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

В ряде случаев преобразования сопровождаются потерей информации. Без потери информации проходят следующие цепочки преобразований:

char -> short -> int -> long

unsigned char -> unsigned short -> unsigned int -> unsigned long

float -> double -> long double

При всех остальных преобразованиях, которые не входят в эти цепочки, мы можем столкнуться с потерей точности данных. Так, в примере выше преобразование от int к char не является безопасным, поэтому к таким преобразованиям следует относиться с осторожностью.

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

Когда, мы что-либо делаем, нам, несомненно, важно знать каков будет результат. Вполне очевидно, что из тех ингредиентов из которых, скажем вариться суп харчо, вряд ли можно приготовить торт со взбитыми сливками. Следовательно, результат напрямую зависит, от составных частей. То же самое происходит с переменными. Если, скажем, складывается два числа типа int, вполне понятно, что результат так же будет иметь тип int. А вот как быть, если данные имеют разные типы? Именно об этом мы и поговорим в текущем разделе данного урока.

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

Несмотря на то, что некоторые типы имеют одинаковый размер, в них помещается разный диапазон значений, например, unsigned int в отличие от int может поместить в себя в два раза больше положительных значений, и потому является старше по иерархии, при этом оба типа имеют размер 4 байта. Кроме того, следует отметить, очень важную особенность, отраженную здесь, если в преобразовании типов участвуют такие типы, как bool,char,short, они автоматически преобразовываются к типу int.

Теперь, давайте рассмотрим, различные классификации преобразований.

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

Как видите, такое преобразование от double к int, ведет к грубому обрезанию вещественного числа, без математического округления, результатом которого являлось бы число 24.

В данном случае 3000000000 — это литерал типа int, который благопоучно расширяется до unsigned int, что и позволяет нам увидеть на экране именно 3000000000, а не что-то другое. Тогда, как в обычный int такое число не поместиться.

Классификация по способу осуществления преобразования

Вне зависимости от направления преобразования, оно может быть осуществлено одним из двух способов.

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

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

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

Пользуясь этими переменными, мы собираемся составить такое выражение:

В переменную какого типа данных нам следует записать результат? Решить это просто, если представить выражение в виде типов данных:

Напоминаем, что short и bool сразу же примут тип int, так что выражение будет выглядеть так:

Умножение int на int даст, несомненно, результат типа int. А вот сложение float с int, даст на выходе float, так как, здесь вступает в игру новое правило: Если в каком-либо выражении используются разные типы данных, то результат, приводится к большему из этих типов. Ну и, наконец – вычитание из int типа float, согласно только что упомянутому правилу снова даст float. Таким образом, результат выражения будет иметь тип float.

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

Примечание: Будьте очень внимательны также и при сочетании переменных с одинаковыми типами данных. Например, помните, если целое делится на целое, то и получиться целое. То есть, int A=3; int B=2; cout«A/B; на экране 1, так как результат — int и дробная часть утеряна. cout«(float)A/B; на экране 1.5, так как результат — float.

Пример, использующий преобразование типов

Теперь давайте закрепим знания на практике. Создадим проект и напишем нижеследующий код.

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

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

Для начала напомним, что оператор приведения типов позволяет компилятору преобразовывать один тип данных в другой. И язык программирования С, и язык программирования С++ поддерживают такую форму записи приведения типа:

Операторы приведения типа в языке С++

Кроме стандартной формы в стиле С, язык С++ поддерживает дополнительные операторы приведения типа. Вполне очевидны положительные стороны этих новых способов. Во-первых данные преобразования позволяют сделать то, чего стандарт языка С даже не предполагал: снять модификатор const, или радикально поменять тип данных. Во-вторых, стиль С++ увеличивает контроль над преобразованиями и позволяет выявить ошибки с ними связанные на ранних этапах.

const_cast используется для явного переопределения модификаторов const и/или volatile. Новый тип должен совпадать с исходным типом, за исключением изменения его атрибутов const или volatile. Чаще всего оператор const_cast используется для снятия атрибута const. Например:

Примечание: Кстати, стоит упомянуть о том, что такое volatile. Данный модификатор даёт компилятору понять, что значение переменной, может быть изменено неявным образом. Например, есть некая глобальная переменная, её адрес передаётся встроенному таймеру операционной системы. В дальнейшем эта конструкция может использоваться для отсчёта реального времени. Естественно, что значение этой переменной изменяется автоматически без участия операторов присваивания. Так вот такая переменная должна быть объявлена с использованием ключевого слова volatile. Это связано с тем, что многие компиляторы не обнаружив ни одного изменения переменной с помощью какого-либо присваивания, считают, что она не изменяется и оптимизируют выражения с ней, подставляя на её место конкретное значение. При этом компилятор переменную не перепроверяет. Действительно, зачем, если переменная для него имеет характер "неизменяемой"?! volatile — будет блокировать подобные действия компиляторов.

dynamic_cast проверяет законность выполнения заданной операции приведения типа. Если такую операцию выполнить нельзя, то выражение устанавливается равным нулю. Этот оператор в основном используется для полиморфных типов. Например, если даны два полиморфных класса, B и D, причем класс D выведен из класса B, то оператор dynamic_cast всегда может преобразовать указатель D* в указатель B*. Оператор dynamic_cast может преобразовать указатель B* в указатель D* только в том случае, если адресуемым объектом является объект D. И вообще, оператор dynamic_cast будет успешно выполнен только при условии, что разрешено полиморфное приведение типов (т.е. если новый тип можно законно применять к типу объекта, который подвергается этой операции). Рассмотрим пример, демонстрирующий всё вышесказанное:

static_cast выполняет неполиморфное приведение типов. Его можно использовать для любого стандартного преобразования. При этом никакие проверки во время работы программы не выполняются. Фактически, static_cast — это аналог стандартной операции преобразования в стиле С. Например, так:

reinterpret_cast переводит один тип в совершенно другой. Например, его можно использовать для перевода указателя в целый тип и наоборот. Оператор reinterpret_cast следует использовать для перевода типов указателей, которые несовместимы по своей природе. Рассмотрим пример:

как в C++ изменить тип данных или присвоить с изменением

int a[5]; char b[5]; for(int i=0;i< 5;i++)b[ i]=a[ i];
Это же все целочисленные типы, автоматически переводятся друг в друга. .

P.S, Чего «нее»? Все скомпилируется без проблем 🙂
Или ты имеешь в виду перевод одного числа в другой тип? int c=5; (char)c будет иметь тип char.

P.P.S. Ты просто не понимаешь разницу между числом, цифрой и кодом. Если тебе нужны из кода числа 5 получить код цифры 5, то char(c+48)
P.P.S. Комментарии скоро не смогу продолжить, на твоем уровне время для комментариев закончится. Разберись с тем, что сказано в P.P.S. Это не фигня, а основы представления данных в языке.
Многозначное — это тебе нужен перевод числа в строку. Для этого есть свои функции, например, sprintf

Чар — это один символ или число от 0 до 255 (или от -128 до 127, в зависимости от реализации) . Одним символом можно записать только однозначное число.
Имейте в виду, что число 48 и символ ‘0’ — это одно и то же.

Для того, чтобы записать многозначное число, надо пользоваться функцией sprintf, или нестандартными расширениями в стиле itoa. В результате будет получен не символ, а последователь символов. Пример.
char str [10];
int i = 123;
sprintf(str, «%d», i);
printf(«%s», str);
Выведет 123. То есть, в массиве чаров (который традиционно называют строкой или стрингом) будет записано «123». Фактически, это будет эквивалентно:
str[0] == ‘1’;
str[1] == ‘2’;
str[2] == ‘3’;
str[3] == 0 == ‘\0’
Обратите внимание на последний символ — это спец. символ с кодом 0, который обозначает конец строки. Никакой «печатный» символ ему не соответствует.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *