UINT_MAX + 1 равно?

Каково заданное поведение в C для UINT_MAX + 1u ? Насколько безопасно предположить, что оно равно нулю?

Из стандарта (C11, 6.2.5 / 9, основное внимание):

[…] Вычисление с использованием неподписанных операндов никогда не может переполняться, потому что результат, который не может быть представлен результирующим беззнаковым целочисленным типом, уменьшается по модулю по числу, которое больше, чем наибольшее значение, которое может быть представлено результирующим типом .

Если UINT_MAX равно 10 :

 (10 + 1) % (10 + 1) == 0 

Итак, да, можно предположить, что он равен нулю.

Следует подчеркнуть, что в то время как неподписанное поведение четко определено, целочисленное переполнение цепочки не является:

На языке программирования C сглаженное целочисленное переполнение вызывает неопределенное поведение, в то время как неподписанное целочисленное переполнение приводит к тому, что число уменьшается по модулю мощности двух

Очень хорошая статья по теме:

ПРИМЕРЫ ЦЕЛЕВЫХ ОПЕРАЦИЙ C / C ++ И ИХ РЕЗУЛЬТАТЫ

 Expression Result ---------- ------ UINT_MAX+1 0 LONG_MAX+1 undefined INT_MAX+1 undefined SHRT_MAX+1 SHRT_MAX+1 if INT_MAX>SHRT_MAX, otherwise undefined char c = CHAR_MAX; c++ varies -INT_MIN undefined (char)INT_MAX commonly -1 1<<-1 undefined 1<<0 1 1<<31 commonly INT_MIN in ANSI C and C++98; undefined in C99 and C++11 1<<32 undefined 1/0 undefined INT_MIN%-1 undefined in C11, otherwise undefined in practice 

Это безопасно. Стандарт C гарантирует, что результат без округления целых чисел без знака равен нулю.

Должно быть безопасно:

Вики на неподписанном переполнении

Обратите внимание на то, что неподписанный int overflow корректно определен.

Кроме того, здесь есть целый вопрос .