Язык Си




Преобразования типов - часть 3


Неявные арифметические преобразования, как правило, осуществляются естественным образом. В общем случае, когда оператор вроде + или * с двумя операндами (бинарный оператор) имеет разнотипные операнды, прежде чем операция начнет выполняться, "низший” тип повышается до "высшего”. Результат будет иметь высший тип. В приложения A правила преобразования сформулированы точно. Если же в выражении нет беззнаковых операндов, можно удовлетвориться следующим набором неформальных правил:

  • Если какой-либо из операндов принадлежит типу long double, то и другой приводится к long double.
  • В противном случае, если какой-либо из операндов принадлежит типу double, то и другой приводится к double.
  • В противном случае, если какой-либо из операндов принадлежит типу float, то и другой приводится к float.
  • В противном случае операнды типов char и short приводятся к int.
  • И наконец, если один из операндов типа long, то и другой приводится к long.

    Заметим, что операнды типа float не приводятся автоматически к типу double; в этом данная версия языка отличается от первоначальной. Вообще говоря, математические функции, аналогичные собранным в библиотеке <math.h>, базируются на вычислениях с двойной точностью. В основном float используется для экономии памяти на больших массивах и не так часто - для ускорения счета на тех машинах, где арифметика с двойной точностью слишком дорога с точки зрения расхода времени и памяти.

    Правила преобразования усложняются с появлением операндов типа unsigned. Проблема в том, что сравнения знаковых и беззнаковых значений зависят от размеров целочисленных типов, которые на разных машинах могут отличаться. Предположим, что значение типа int занимает 16 битов, а значение типа long - 32 бита. Тогда -1L < 1U, поскольку 1U принадлежит типу unsigned int и повышается до типа signed long. Но –1L >1UL, так как -1L повышается до типа unsigned long и воспринимается как большое положительное число.

    Преобразования имеют место и при присвоениях: значение правой части присвоения приводится к типу левой части, который и является типом результата.




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