Что такое заданное поведение в C для UINT_MAX + 1u
? Насколько безопасно предположить, что он равен нулю?
UINT_MAX + 1 равно?
Ответ 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 гарантирует, что результат беззнакового целого числа переполнения будет равен нулю.
Ответ 4
Должно быть безопасно:
Wiki при неподписанном переполнении
Обратите внимание на то, что неподписанный переполнение int хорошо определено.
Кроме того, здесь весь вопрос об этом.