Ответы Mail.ru: Неявное приведение типов в С

Твой первый пример выводит мусор в старшем 32-битном слове, если sizeof(long long) == 8, а sizeof(int) == 4 (как практически везде сейчас и есть). Замени %lld на %u, если хочешь печатать unsigned int.

Далее, приведения типов при вычислении выражения не зависят от типа переменной-приёмника (lvalue). Туда потом отдельно всё приводится.

Поэтому во втором выражении дело обстоит так:

 long long a = (long long)(u + (unsigned int)i); 

Операнды суммируются как беззнаковые, переполнение отбрасывается, и ты получаешь свои 90 в 32-битном unsigned int. А потом уже результат приводится к long long.

Третий случай отличается от второго отрицательным значением суммы. Но поскольку она хранится в беззнаковом 32-битном типе int, получается 2 в 32-й степени минус 10. Преобразование в long long идёт без расширения знака (исходный тип же - беззнаковый), так что 4 миллиарда остаются 4-мя миллиардами, а не -10.