UINT_MAX + 1 равно?

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

Ответ 1

Из стандартного (C11, 6.2.5/9, акцент мой):

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

Если UINT_MAX - 10:

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

Итак, да, это безопасно считать нулевым.

Ответ 2

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

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

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

ПРИМЕРЫ ЦЕЛЕВЫХ ОПЕРАЦИЙ 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

Ответ 3

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