6. Преобразования
В #6.6 содержится краткое описание
преобразований, требуемых наиболее стандартными операциями;
оно будет дополняться по мере надобности в процессе обсужде-
ния каждой операции. В #8.5.6 описываются преобразования, оп-
ределяемые пользователем.
6.1 Символы и Целые
Символ или короткое целое могут использоваться, если мо-
жет использоваться целое. Во всех случаях значение
преобразуется к целому. Преобразование короткого целого к
длинному всегда включает в себя знаковое расширение; целые
являются величинами со знаком. Содержат символы знаковый раз-
ряд или нет, является машинно зависимым, см. #2.6. Более яв-
ный тип unsigned char ограничивает изменение значения от 0 до
машинно зависимого максимума.
подвергается знаковому расширению и
может стать отрицательным числом; так например, '\377' имеет
значение -1.
Когда длинное целое преобразуется в короткое или в char,
оно урезается влево; избыточные биты просто теряются.
6.2 float и double
Для выражений float могут выполняться действия арифмети-
ки с плавающей точкой одинарной точности. Преобразования меж-
ду числами одинарной и двойной точности выполняются настолько
математически корректно, насколько позволяет аппаратура.
6.3 Плавающие и Целые
Преобразования плавающих значений в целочисленный тип
имеет склонность быть машинно зависимым. В частности, направ-
ление усечения отрицательных чисел различается от машины к
машине. Если предоставляемого пространства для значения не
хватает, то результат неопределен.
Преобразование целочисленного значения в плавающий тип
выполняются хорошо. При нехватке в аппаратной реализации тре-
буемых бит возникает некоторая потеря точности.
6.4 Указатели и Целые
Выражение целого типа можно прибавить к указателю или
вычесть из него. В таком случае первый преобразуется, как
указывается при обсуждении операции сложения.
Можно производить вычитание над двумя указателями на
объекты одного типа; в этом случае результат преобразуется к
типу int или long в зависимости от машины, см. #7.4.
6.5 unsigned
Всегда при сочетании целого без знака и обычного целого
обычное целое преобразуется к типу unsigned и результат имеет
тип unsigned. Значением является наименьшее целое без знака,
равное целому со знаком (mod 2**(размер слова)) (т.е. по мо-
дулю 2**(размер слова)). В дополнительном двоичном представ-
лении это преобразование является пустым, и никаких реальных
изменений в двоичном представлении не происходит.
При преобразовании целого без знака в длинное значение
результата численно совпадает со значением целого без знака.
Таким образом, преобразование сводится к дополнению нулями
слева.
6.6 Арифметические Преобразования
Большое количество операций вызывают преобразования и
дают тип результата одинаковым образом. Этот стереотип будет
называться "обычным арифметическим преобразованием".
Во-первых, любые операнды типа char, unsigned char или
short преобразуются к типу int.
Далее, если один из операндов имеет тип double, то дру-
гой преобразуется к типу double и тот же тип имеет ре-
зультат.
Иначе, если один из операндов имеет тип unsigned long,
то другой преобразуется к типу unsigned long и таков же
тип результата.
Иначе, если один из операндов имеет тип long, то другой
преобразуется к типу long и таков же тип результата.
Иначе, если один из операндов имеет тип unsigned, то
другой преобразуется к типу unsigned и таков же тип ре-
зультата.
Иначе оба операнда должны иметь тип int и таков же тип
результата.
6.7 Преобразования Указателей
Везде, где указатели присваиваются, инициализируются,
сравниваются и т.д. могут выполняться следующие преобразова-
ния.
Константа 0 может преобразовываться в указатель, и га-
рантируется, что это значение породит указатель, отлич-
ный от указателя на любой объект.
Указатель любого типа может преобразовываться в void*.
Указатель на класс может преобразовываться в указатель
на открытый базовый класс этого класса, см. #8.5.3.
Имя вектора может преобразовываться в указатель на его
первый элемент.
...".
6.8 Преобразования Ссылок
Везде, где инициализируются ссылки, может выполняться
следующее преобразование.
Ссылка на класс может преобразовываться в ссылку на отк-
рытый базовый класс этого класса, см. #8.6.3.
[Назад] [Содержание] [Вперед]
| Главная |