main()
{
int total;
float cost, shipping;
cost = 56.09;
shipping = 4.98;
total = cost + shipping;
printf("Общая стоимость составляет
сумму %d долларов", total);
}
В операции сложения участвуют две переменные типа float (cost и shipping), но
полученный результат присваивается целочисленной переменной total. Если сложить эти
числа на калькуляторе, то в результате получим 61.07, но так как переменная total—
целочисленная, то и результат будет преобразован в целое число. Использование
указателя формата %d задает отображение на экране целого числа 61. Обратите
внимание, вначале выполняется математическое действие, а затем происходит
присваивание значения. Если бы заданные значения преобразовывались в целые числа
до их сложения, то результат оказался бы равен 60 (56+4).
Аналогичные правила соблюдаются и при выполнении деления. Но имейте в виду:
если вы хотите, чтобы переменная, содержащая результат деления и определенная как
float, имела значимые цифры в десятичной части, необходимо, чтобы хотя бы у одного из
участвующих в делении чисел (литералов) также имелась дробная часть.
При выполнении операций производится автоматическое преобразование типов,
чтобы привести операнды выражений к общему типу или чтобы расширить короткие
величины до размера целых величин, используемых в машинных командах. Выполнение
преобразования зависит от специфики операций и от типа операнда или операндов.
Рассмотрим общие арифметические преобразования.
1. Операнды типа float преобразуются к типу double.
2. Если один операнд long double, то второй преобразуется к этому же типу.
3. Если один операнд double, то второй также преобразуется к типу double.
4. Любые операнды типа char и short преобразуются к типу int.
5. Любые операнды unsigned char или unsigned short преобразуются к типу
unsigned int.
6. Если один операнд типа unsigned long, то второй преобразуется к типу unsigned
long.
7. Если один операнд типа long, то второй преобразуется к типу long.
8. Если один операнд типа unsigned int, то второй операнд преобразуется к этому
же типу.
Таким образом, можно отметить, что при вычислении выражений операнды
преобразуются к типу того операнда, который имеет наибольший размер.
Проблемы, которые могут возникать при преобразовании типов данных:
Преобразование Возможные проблемы
Данные с плавающей точкой большей
размерности в данные с плавающей точкой
меньшей размерности
Потеря точности (значащих цифр). Величина
преобразуемых данных может превышать
допустимый диапазон целевого типа, тогда
результат будет неопределенным
Данные с плавающей точкой
в целочисленные данные
Потеря дробной части. Величина
преобразуемых данных может превышать
допустимый диапазон целевого типа, тогда
результат будет
неопределенным
Целочисленные данные большей размерности в
целочисленные данные меньшей размерности,
например, тип long в тип short
Исходное значение может не укладываться в
допустимый диапазон целевого типа. Обычно
копируются только младшие разряды