В операциях присваивания тип значения, которое присваивается, преобразуется к типу переменной, получающей это значение. Допускается преобразование целых и плавающих типов, даже если такое преобразование ведет к потере информации.
Преобразование целого со знаком к плавающему типу происходит без потери информации, за исключением случая преобразования значения с типом long int или unsigned long int, когда точность плавающего числа может быть недостаточна для преобразования без потери.
При преобразовании величины с плавающей точкой к целым типам она сначала преобразуется к типу long (дробная часть плавающей величины при этом отбрасывается), а затем величина типа long преобразуется к требуемому целому типу. Если значение слишком велико для long, то результат преобразования не определен.
Преобразование из float, double или long double к типу unsigned long производится с потерей точности, если преобразуемое значение больше, чем максимально возможное положительное значение, представленное типом long.
Указатель на тип void может быть преобразован к указателю на любой тип и указатель на любой тип может быть преобразован к указателю на тип void без ограничений. Значение указателя может быть преобразовано к целой величине. Метод преобразования зависит от размера указателя и размера целого типа следующим образом:
— если размер указателя меньше размера целого типа или равен ему, то указатель преобразуется точно так же, как целое без знака;
— если размер указателя больше, чем размер целого типа, то указатель сначала преобразуется к указателю с тем же размером, что и целый тип, и затем преобразуется к целому типу.
Целый тип может быть преобразован к адресному типу по следующим правилам:
— если целый тип того же размера, что и указатель, то целая величина просто рассматривается как указатель (целое без знака);
— если размер целого типа отличен от размера указателя, то целый тип сначала преобразуется к размеру указателя (используются способы преобразования, описанные выше), а затем полученное значение трактуется как указатель.
Если задан прототип функции, и он включает объявление типов аргументов, то над аргументами при вызове функции выполняются только обычные арифметические преобразования.
Если прототип функции отсутствует, то при вызове происходят только обычные арифметические преобразования для аргументов. Эти преобразования выполняются независимо для каждого аргумента. Величины типа float преобразуются к double, величины типа char и short преобразуются к int, величины типов unsigned char и unsigned short преобразуются к unsigned int. Могут быть также выполнены неявные преобразования переменных типа указатель. Задавая прототипы функций, можно переопределить эти неявные преобразования и позволить компилятору выполнить контроль типов.
'(' Имя типа ')' Операнд
В приведенной записи
Пример:
int i=2;
long l=2;
double d;
float f;
d=(double)i * (double)l;
f=(float)d;
В данном примере величины