Литералы на 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
.