Как unsigned int
может хранить отрицательное число?
Это не так.Вместо этого он хранит представимое число, которое совпадает с этим отрицательным числом по модулю числа всех представимых значений.То же самое верно и для результатов, которые превышают наибольшее представимое значение.
Сохраняется ли использование или это приводит к неопределенному поведению?
Нет UB. Un хорошо выражено арифметическое переполнение со знаком.
На результат можно положиться.Тем не менее, это может быть хрупким.Например, если вы добавите -22u
и 100ull
, тогда вы получите UINT_MAX + 79
(то есть большое значение, предполагая, что unsigned long long
- это больший тип, чем unsigned
), что соответствует 78 по модулю UINT_MAX + 1
, которое представимов unsigned long long
, но не представляется в unsigned
.
Обратите внимание, что знаковое арифметическое переполнение равно не определено.