C++ CSS HTML Java JavaScript MySQL Oracle PERL PHP SQL Unix VBScript XHTML XML Сети
Справочное руководство. Преобразования.
 
                  
                      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.

[Назад] [Содержание] [Вперед]

Главная