Читать «Полный справочник по С++» онлайн - страница 28

Герберт Шилдт

int х; char ch; float f;

void func(void)

{

}

В строке I левый старший разряд целой переменной х отбрасывается, и переменной ch присваиваются 8 младших битов. Если значение переменной х изменяется от 0 до 255, то переменные ch и х будут эквивалентными. (Это относится лишь к тем компиляторам, в которых переменные типа char по умолчанию не имеют знака. Если тип char по умолчанию имеет знак, то переменные ch и х будут эквивалентными, только если переменная х изменяется от —128 до 127 либо переменная ch имеет тип unsigned char — Прим. ред.) В противном случае в переменной ch будут учтены лишь 8 младших бит переменной х. В строке 2 переменной х будет присвоена целая часть переменной f. В строке 3 восьмибитовое целое число, хранящееся в переменой ch, будет преобразовано в число с плавающей точкой. То же самое произойдет и в строке 4, только теперь в число с плавающей точкой будет преобразовано целочисленное значение переменной х.

В процессе преобразования типа int в тип char и типа long int в тип int старшие разряды отбрасываются. Во многих 16-битовых операционных системах это означает, что 8 бит будет потеряно. В 32-разрядных операционных системах при преобразовании типа int в тип char будет потеряно 24 бит, а при преобразовании типа int в тип short int — 16 бит.

Правила преобразования типов суммированы в табл. 2.3. Помните, что преобразование типа int в тип float, типа float в тип double и так далее не увеличивает точности. Этот вид преобразований лишь изменяет способ представления числа. Кроме того, некоторые компиляторы при преобразовании типа char в тип int или float по умолчанию считают тип char не имеющим знака, независимо от значения переменной. Другие компиляторы преобразовывают значения символьных переменных, превышающие 127, в отрицательные числа. Итак, если вы хотите избежать проблем, для работы с символами следует использовать тип char, а для работы с целыми числами — ТИП int, short int или signed char.

Если вам необходимо выполнить преобразование типа, не указанное в табл. 2.3, преобразуйте его сначала в промежуточный тип, который есть в таблице, а затем — в результирующий тип. Например, чтобы преобразовать тип double в тип int, сначала следует преобразовать тип double в тип float, а затем тип float — в тип int. (Разумеется, это относится лишь к анализу возможных потерь точности. Любой компилятор совершенно свободно выполнит преобразование типа double в тип int, не требуя промежуточных преобразований. — Прим. ред.)

Таблица 2.3. Правила преобразования типов
Результирующий типТип выраженияВозможные потери
signed charcharЕсли значение > 125, результатом будет отрицательное число
charshort intСтаршие 8 бит
charint (16 бит)Старшие 8 бит
charint (32 бит)Старшие 24 бит
charlong intСтаршие 24 бит
short intint (16 бит)Нет
short intint (32 бит)Старшие 16 бит
int (16 бит)long intСтаршие 16 бит
int (32 бит)long intНет
intfloatДробная часть и, возможно, что-то еще
floatdoubleТочность, результат округляется
doublelong doubleТочность, результат округляется