Люди, которые говорят, что значения всегда преобразуются в больший тип, неверны.Мы не можем говорить ни о чем, если мы не знаем вашу платформу (я вижу, вы предоставили некоторую информацию сейчас).Некоторые примеры
int = 32бит, uint16_t = unsigned short, int8_t = знаковый символ
Это приводит к значению -2500
, поскольку оба операнда преобразуются в int
,и операция выполняется со знаком, а подписанный результат записывается в int32_t
.
int = 16 бит, uint16_t = беззнаковый int, int8_t = знаковый символ
Это приводит к значению 63036, поскольку операнд int8_t
сначала преобразуется в unsinged int
, что приводит к 65536-50
.Затем он умножается на него, в результате чего получается 3 274 300 % 65536
(без знака по модулю арифметика), равное 63036. Этот результат затем записывается в int32_t
.
Обратите внимание, что минимальный размер int
бит 16
бит.Так что на вашей 8-битной платформе этот второй сценарий, скорее всего, произойдет.
Я не буду пытаться объяснить правила здесь, потому что мне не имеет смысла повторять то, что написано в стандарте / проекте (которое свободно доступно), в мельчайших деталях ичто обычно легко понятно.