2016-11-30 14 views
3

Я пытался прочитать стандарт 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, но любой другой стандарт, я думаю, применил бы те же правила.

+0

Нет стандарта 'C/C++'. Существует стандарт «C», стандарт «C++». И эти два очень разные документы. – StoryTeller

+0

C в основном почти истинное подмножество C++, по крайней мере ANSI C89.И да, вы расширяетесь независимо от того, находится ли меньшее целое число слева или справа от знака +. –

+2

* «C в основном почти истинное подмножество C++, по крайней мере ANSI C89« * - Это не так, я боюсь. – StoryTeller

ответ

2

См. Раздел 5 Выражения [выражение]. Точка 10 начинается

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

The подпункты, которые следуют говорят такие вещи, как «Если либо операнд это ...»,»... другой должны ... ",„Если оба операндов ...“и т.д.

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

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