Литералы на C/С++

Может ли кто-нибудь помочь мне идентифицировать в стандартах (C99 и С++ 03), что происходит с приведенной ниже строкой?

uint16_t a = 5;

Итак, слева - типизированная переменная, справа - букваль, когда и как буквальное значение получает тип переменной?

Является ли приведенное выше присвоение эквивалентным выражению ниже?

uint16_t a = (uint16_t)5;  /* C */
uint16_t a = reinterpret_cast<uint16_t>(5);  // C++

Как насчет:

uint16_t a = 5u;

Тогда, если у вас есть что-то вроде:

uint32_t b = a + 5;

Является ли приведенное выше выражение эквивалентным заявлению ниже?

uint32_t b = (uint32_t)(a + (uint16_t)(5));  /* C */
uint32_t b = reinterpret_cast<uint32_t>(a + reinterpret_cast<uint16_t>(5));  // C++

Что-то изменилось в C11 и С++ 14? Кроме того, предположим, что система int 32 бит.

Я некоторое время программировал на C, но никогда не понимал этого глубоко, но меня это всегда беспокоит, поэтому я был бы признателен, если кто-то может помочь мне разобраться.

Спасибо...

(Отредактировано: добавлено предположение, что int 32 бит)

Ответы

Ответ 1

Правило состоит в том, что сначала оценивается RHS, а затем значение преобразуется для целевого типа. В частности,

uint32_t b = a + 5;

эквивалентно

uint32_t b = (uint32_t)((int)a + 5);

Если uint16_t - узкий тип, уже int.

Все операции в C (и я думаю, также на С++), по крайней мере, имеют целочисленный ранг int.