Решено!
Соответствующий отрывок можно найти в C90 ISO 9899:1990 6.1.2.5 Типы:
«[..] Вычисление, включающее операнды без знака, никогда не может переполниться, потому что [...]»
Поэтому 9899:1990 6.3 не может применяться и, следовательно, не может быть неопределенным поведением.
- C90: см. полный ответ ниже.
- C99: см. ответ для "Определено ли поведение вычитания целых чисел без знака?"
Спасибо Киту Томпсону за помощь в чтении. :-)
[2014-03-14] По-видимому, короткое целое число без знака может переполниться, что приведет к неопределенному поведению в зависимости от целевой среды. Это может произойти, если короткое целое число без знака будет арифметически преобразовано в целое число. Подробности см. в обновленном ответе и комментариях supercat. Спасибо обоим. :-)
Оригинальный вопрос:
Прежде всего, извините за мой плохой английский... Я стараюсь изо всех сил. Это мой первый вопрос, и я думаю, довольно глупый.
По каким-то печальным причинам моя компания все еще придерживалась ANSI C90 (ANSI/ISO 9899:1990), поэтому у меня в руках старая копия этого стандарта, но до сих пор отсутствуют исправления и исправления.
У меня действительно простой вопрос, и я прекрасно знал ответ во времена учебы - пока не попытаюсь прочитать его в стандарте.
Что произойдет, если у меня возникнет переполнение целого числа без знака при добавлении. Пожалуйста, посмотрите этот фрагмент кода:
uint32_t a,b,c;
b = UINT_MAX;
c = UINT_MAX;
a = b + c; /* Overflow here - undefined behavior? */
Все, что я когда-либо знал об этом, это то, что это целое число без знака просто переносится столько, сколько нужно, и все в порядке, хотя и не всегда предназначено.
Сейчас искал соответствующие детали в стандарте.
Конечно, существует ISO 9899:1990 6.2.1.2, в котором описывается перенос целых чисел без знака всякий раз, когда они преобразуются. И есть немного 6.2.1.5 «обычных арифметических преобразований», которые описывают, как типы становятся шире, в основном, что оба операнда выражения имеют один и тот же тип.
Теперь есть 6.3 «Выражения», которые касаются меня. я цитирую:
"[...] Если во время вычисления выражения возникает исключение (то есть, если результат не определен математически или НЕ В ДИАПАЗОНЕ ПРЕДСТАВЛЯЕМЫХ ЗНАЧЕНИЙ ДЛЯ ЕГО ТИПА), поведение НЕОПРЕДЕЛЕНО. [...]"
И глава 6.3.6 об аддитивных операторах говорит:
- обычные арифметические преобразования операндов, которые не применяются, так как все uint32_t.
- и результатом является сумма обоих, что явно не вписывается в uint32_t.
- ОТЛИЧНО
Ничего не сказано о том, что результирующее значение преобразуется в тип результата, поэтому 6.2.1.2 не применяется. Но значение то явно зашкаливает, где 6,3 ступени.
Насколько я понимаю, это неопределенное поведение в соответствии с ISO 9899:1990. Что я пропустил? Есть ли что-то в Corrigendae? Я пропустил строку или слово в стандарте?
Я действительно смущен сейчас. :-)
С уважением, Марк
Обновление вопроса
[2014-03-03] Решено
[2014-03-03] Итак, благодаря Acme у меня теперь есть четкий и полный ответ для ANSI C99 (см. ответ на: "Является ли вычитание целого числа без знака определенным поведением": это четко определенное поведение, как и ожидалось. И хотя я ожидаю этого для ANSI C90 кроме того, я до сих пор не могу прочитать это из текста ISO 9899:1990, учитывая текстовые отрывки выше. Поэтому я считаю, что на данный момент мой вопрос до сих пор остается без ответа.
Редактировать: просто опечатки | Edit2: добавить теги C90 и стандартов | Edit3: добавить обновление вопроса | Edit4: добавить решенный раздел | Edit5: добавьте ссылки на ответы :-) | Edit6: обновить короткие целочисленные переполнения без знака | Edit7: некоторые опечатки