670 Глава 12

Delphi	Размер или значение	Соответствие С++	Реализация I
PChar	указатель на символы 32 бита	unsigned char *	typedef
PAnsiChar	указатель на символы ANSI 32 бита	unsigned char *	typedef
Comp	число с плавающей запятой 64 бита	Comp	класс
OleVariant	значение variant OLE	OleVariant	класс

12.2 Приведение типов

В арифметических выражениях, содержащих элементы различных арифмети-
ческих типов, C++Builder в процессе вычислений автоматически осуществляет
преобразование типов. Это стандартное преобразование всегда осуществляется по
принципу: если операция имеет операнды разных типов, то тип операнда «млад-
шего» типа приводится к типу операнда «старшего» типа. Иначе говоря, менее
точный тип приводится к более точному. Например, если в операции участвует ко-
роткое целое и длинное целое, то короткое приводится к длинному; если участвует
целый и действительный операнды, то целый приводится к действительному и т.д.
Таким образом, после подобного приведения типов оба операнда оказываются од-
ного типа. И результат применения операции имеет тот же тип.

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

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

double a = 5.4, Ь = 2;

int с = а * b;

переменная с получит значение 10, хотя истинное значение должно быть раы^
10.8. Это значение действительно будет вычислено в результате умножения а * b
но затем дробная часть будет отброшена, поскольку с — целая переменная.
Результатом выполнения операторов

int m = 1,
double A =

2;

n;

будет значение А = 0. Поскольку тип — целые переменные, то деление m / n свс
дется к целочисленному делению с отбрасыванием дробной части, результат кот.'
рого равен нулю.

Результат выполнения похожих на предыдущие операторов

int m =
double n
double A

1;

2;

m /

даст правильный результат — А = 0.5. Поскольку в данном случае один из операн-
дов операции деления имеет тип double, то тип другого, целого операнда будет
тоже приведен к double и результат деления будет иметь тип double.
Еще один пример, который дает совершенно неверный результат:

double а = 300, b = 200;

short с = а * b;