Я не могу понять этот вывод?
Значение signed int
-1
равно преобразовано в unsigned int
. Из C11 6.3.1.3p2 при преобразовании значения со знаком в «новый тип», который равен unsigned int
(вы можете найти страницу неявных преобразований cppreference более доступной):
Когда значение с целочисленным типом преобразуется в другой целочисленный тип, отличный от _Bool, если значение может быть представлено новым типом, оно не изменяется.
В противном случае, если новый тип без знака, значение преобразуется путем многократного добавления или вычитания на единицу большего, чем максимальное значение, которое может быть представлено в новом типе, до тех пор, пока значение не окажется в диапазоне нового типа.
Итак -1
не представляется в unsigned int
. Поэтому мы должны прибавить или вычесть UINT_MAX+1
к этому значению, чтобы получить что-то, что можно представить в unsigned int
. Итак, мы добавляем UINT_MAX+1
к -1
, предполагая, что на вашей платформе UINT_MAX
равно 4294967295
, мы получаем UINT_MAX + 1 - 1 = 4294967295
. Отлично, теперь значение представлено в unsigned int
, и это значение присвоено.
Почему эта программа не выдает ошибку
Потому что C - это слабо типизированный язык в случае целочисленных типов и неявных преобразований между некоторыми типами - это всего лишь часть языка.