Как определить тип результата арифметического выражения?
Ответ
Операнды арифметических типов в под-выражениях должны быть приведены к общему типу, чтобы можно было выполнить операцию и получить тип результирующего выражения.
Процесс получения общего типа для операндов операций и выведения результирующего типа носит название обычных арифметических преобразований - usual arithmetic conversions
Порядок преобразование типов операндов арифметических типов в выражениях определяется следующим образом, как это описано в разделе 5 Expressions стандарта C++:
—(10.2) If either operand is of type long double, the other shall be
converted to long double.
То есть если один из операндов имеет тип long double, то второй операнд приводится к тому типу.
—(10.3) Otherwise, if either operand is double, the other shall be
converted to double.
Иначе, если один из операндов имеет тип double, то второй операнд также должен быть приведен к этому типу.
—(10.4) Otherwise, if either operand is float, the other shall be
converted to float.
Иначе, если один операнд имеет тип float, то второй операнд также должен быть приведен к этому типу.
—(10.5) Otherwise, the integral promotions (4.5) shall be performed on
both operands.61 Then the following rules shall be applied to the
promoted operands:
Иначе применяется целочисленное приведение типов.
—(10.5.1) If both operands have the same type, no further conversion
is needed.
Если после этого типы совпадают, то дальнейшие преобразования не производятся.
—(10.5.2) Otherwise, if both operands have signed integer types or
both have unsigned integer types, the operand with the type of lesser
integer conversion rank shall be converted to the type of the operand
with greater rank.
Иначе если оба операнда имеют беззнаковый или знаковый тип, то операнд с меньшем рангом преобразуется к типу операнда с большим рангом.
—(10.5.3) Otherwise, if the operand that has unsigned integer type has
rank greater than or equal to the rank of the type of the other
operand, the operand with signed integer type shall be converted to
the type of the operand with unsigned integer type.
Иначе, если операнд беззнакового целого типа имеет ранг больший или равный рангу знакового целого типа второго операнда, то второй операнд преобразуется к типу беззнакового целого типа первого операнда.
—(10.5.4) Otherwise, if the type of the operand with signed integer
type can represent all of the values of the type of the operand with
unsigned integer type, the operand with unsigned integer type shall be
converted to the type of the operand with signed integer type.
Иначе если операнд знакового целого типа может представить все значения беззнакового целого типа второго операнда, то второй операнд преобразуется к типу первого операнда.
—(10.5.5) Otherwise, both operands shall be converted to the unsigned
integer type corresponding to the type of the operand with signed
integer type.
Иначе оба операнда должны быть преобразованы к беззнаковому целому типу, соответствующему знаковому целому типу первого операнда.
Вот простой пример
Имеются два объявления
long int x = 0;
unsigned int y = 0;
и оба типа, long int и unsigned int, занимают 4 байта
Спрашивается, какой тип будет у варажения
x + y
Уверяю вас, что многие программисты, которые не читали этот раздел стандарта, будут не в состоянии ответить на этот вопрос:)
Ответ: согласно последнему подпункту цитаты типом выражения будет unsigned long int
Имейте в виду, что ранг типа long int всегда больше ранга int и, соответственно, ранга unsigned int
Комментариев нет:
Отправить комментарий