Правила расширения и сужения в C/C++

Я пытался прочитать стандарт C/C++ для этого, но я не могу найти ответ.

Скажем, у вас есть следующий фрагмент:

int8_t m;
int64_t n;

И что в какой-то момент вы выполняете m + nСамо сложение является бинарным оператором, и я думаю, что наиболее вероятное, что произойдет в таком случае:

  1. Широкий m к тому же размеру nНазовите расширяющийся результат m_prime
  2. выполнять m_prime + n
  3. Вернуть результат типа int64_t

Я пытался понять, однако, если вместо выполнения m+n Я выполнил n+m результат изменится (потому что, возможно, вместо расширения могут быть операции сужения).

Я не могу найти ту часть стандарта, которая проясняет этот момент (который, как я понимаю, может показаться тривиальным).

Может кто-нибудь указать мне, где я могу найти это в стандарте? или что вообще происходит в ситуациях, подобных той, которую я разоблачил?

Лично я просматривал раздел "Аддитивные операторы", но мне не кажется, что объясняется, что происходит, арифметика указателей рассматривается немного, но нет никаких ссылок на неявно применяемое правило приведения.

Вы можете предположить, что я говорю о C++11, но любой другой стандарт, который я предполагаю, будет применять те же правила.

1 ответ

Решение

См. Пункт 5 "Выражения" [expr]. Точка 10 начинается

Многие бинарные операторы, которые ожидают операнды арифметического или перечислимого типа, вызывают преобразования и выдают типы результатов аналогичным образом. Цель состоит в том, чтобы получить общий тип, который также является типом результата. Этот шаблон называется обычными арифметическими преобразованиями, которые определяются следующим образом:

Подпункты, которые следуют, говорят такие вещи, как "Если один из операндов...", "... другой должен...", "Если оба операнда..." и т. Д.

Для вашего конкретного примера см. 10.5.2

В противном случае, если оба операнда имеют целочисленные типы со знаком или оба имеют целочисленные типы без знака, операнд с типом ранга преобразования с меньшим целым числом должен быть преобразован в тип операнда с большим рангом.

Другие вопросы по тегам