Изменить: Изменено значение для USHRT_MAX
, поскольку оно не соответствует, как показано комментариями.
Представьте, что у вас есть фантастический компилятор, где его ограничения типа integer, как определено в limits.h, следующие:
#define INT_MAX 2147483647 /* Typical 32-bit system value */
#define USHRT_MAX 2147483647 /* ***Edited***, original question had 2000000000 */
И в моем приложении у меня есть следующий код:
unsigned short a = 1500000000;
unsigned short b = 1500000000;
unsigned short c;
c = a + b;
Насколько я знаю, что произойдет в последней инструкции:
- Интегральное продвижение по
a
. Посколькуint
может принимать все значенияunsigned short
,a
получает повышение доint
. - По тем же причинам
b
получает повышение доint
. - Дополнение происходит на типах
int
. - Результат не представлен в
int
. Undefined Поведение в соответствии с пунктом 6.5/5.
Я правильно ли рассуждаю? Это действительно вызывает поведение Undefined или где я ошибаюсь? Обратите внимание, что мой код работает только с неподписанными типами, и результат, применяющий модуль для целых чисел без знака, можно ожидать из-за законного переполнения неподписанных типов.
Если ответ на предыдущий вопрос "да, Undefined поведение", это произошло для законного совместимого компилятора. Итак, можете ли вы сказать, что код приложения, который я опубликовал, неверен? Могут ли все неявные кастинговые небольшие беззнаковые целочисленные дополнения потенциально вызвать поведение Undefined?