Читать «Полный справочник по С++» онлайн - страница 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 char | char | Если значение > 125, результатом будет отрицательное число |
char | short int | Старшие 8 бит |
char | int (16 бит) | Старшие 8 бит |
char | int (32 бит) | Старшие 24 бит |
char | long int | Старшие 24 бит |
short int | int (16 бит) | Нет |
short int | int (32 бит) | Старшие 16 бит |
int (16 бит) | long int | Старшие 16 бит |
int (32 бит) | long int | Нет |
int | float | Дробная часть и, возможно, что-то еще |
float | double | Точность, результат округляется |
double | long double | Точность, результат округляется |