Стандарт C99 определяет, что бинарные операторы, такие как *
, не работают с целочисленными типами, меньшими int
.Выражения этих типов повышаются до int
до применения оператора.См. Пункт 6.3.1.4 и многочисленные вхождения слов «целочисленное продвижение».Но это несколько ортогонально инструкциям сборки, сгенерированным компилятором, которые работают на int
s, потому что это быстрее, даже когда компилятору будет позволено вычислить более короткий результат (потому что результат сразу сохраняется в l-значениинапример, короткий тип).
Что касается int64 f = d * e;
, где d
и e
имеют тип int
, умножение выполняется как int
в соответствии с теми же правилами продвижения.Технически это переполнение неопределенное поведение , вы получаете здесь результат с двумя дополнениями, но вы можете получить что-нибудь в соответствии со стандартом.
Примечание: правила продвижения различают подписанный и неподписанный типыпри продвижении.Правило состоит в том, чтобы выдавать меньшие типы на int
, если int
не может представлять все значения типа, в этом случае используется unsigned int
.