Страницы

Поиск по вопросам

суббота, 23 марта 2019 г.

Определение типа

Как определить тип результата арифметического выражения?


Ответ

Операнды арифметических типов в под-выражениях должны быть приведены к общему типу, чтобы можно было выполнить операцию и получить тип результирующего выражения.
Процесс получения общего типа для операндов операций и выведения результирующего типа носит название обычных арифметических преобразований - 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

Комментариев нет:

Отправить комментарий