Приведение без явного оператора приведения типа совершенно допустимо в C, но может иметь неопределенное поведение.В вашем случае int x;
подписано, поэтому, если вы попытаетесь сохранить в нем значение, выходящее за пределы диапазона int
, ваша программа будет иметь неопределенное поведение.С другой стороны, если x
было объявлено как unsigned x;
, поведение четко определено;приведение происходит через уменьшение по модулю UINT_MAX+1
.
Что касается арифметики, когда вы выполняете арифметику между целыми числами разных типов, «меньший» тип переводится в «больший» тип до арифметики.Разумеется, компилятор может оптимизировать это повышение, если оно не влияет на результаты, что приводит к таким идиомам, как приведение 32-разрядного целого к 64-разрядному перед умножением для получения полного 64-разрядного результата.Продвижение становится немного запутанным и может привести к неожиданным результатам, когда значения со знаком и без знака смешаны.Вам следует поискать это, если вы хотите знать, потому что это трудно объяснить неофициально.