Правила расширения и сужения в C/C++
Я пытался прочитать стандарт C/C++ для этого, но я не могу найти ответ.
Скажем, у вас есть следующий фрагмент:
int8_t m;
int64_t n;
И что в какой-то момент вы выполняете m + n
Само сложение является бинарным оператором, и я думаю, что наиболее вероятное, что произойдет в таком случае:
- Широкий
m
к тому же размеруn
Назовите расширяющийся результатm_prime
- выполнять
m_prime + n
- Вернуть результат типа
int64_t
Я пытался понять, однако, если вместо выполнения m+n
Я выполнил n+m
результат изменится (потому что, возможно, вместо расширения могут быть операции сужения).
Я не могу найти ту часть стандарта, которая проясняет этот момент (который, как я понимаю, может показаться тривиальным).
Может кто-нибудь указать мне, где я могу найти это в стандарте? или что вообще происходит в ситуациях, подобных той, которую я разоблачил?
Лично я просматривал раздел "Аддитивные операторы", но мне не кажется, что объясняется, что происходит, арифметика указателей рассматривается немного, но нет никаких ссылок на неявно применяемое правило приведения.
Вы можете предположить, что я говорю о C++11, но любой другой стандарт, который я предполагаю, будет применять те же правила.
1 ответ
См. Пункт 5 "Выражения" [expr]. Точка 10 начинается
Многие бинарные операторы, которые ожидают операнды арифметического или перечислимого типа, вызывают преобразования и выдают типы результатов аналогичным образом. Цель состоит в том, чтобы получить общий тип, который также является типом результата. Этот шаблон называется обычными арифметическими преобразованиями, которые определяются следующим образом:
Подпункты, которые следуют, говорят такие вещи, как "Если один из операндов...", "... другой должен...", "Если оба операнда..." и т. Д.
Для вашего конкретного примера см. 10.5.2
В противном случае, если оба операнда имеют целочисленные типы со знаком или оба имеют целочисленные типы без знака, операнд с типом ранга преобразования с меньшим целым числом должен быть преобразован в тип операнда с большим рангом.