Я пытаюсь уменьшить 32-битное значение до 16-битного числа со знаком (uint32_t -> int16_t) или, другими словами, пытаюсь уменьшить мой результат uin32_t до 0 - 32767 (int16_max). Мой код выглядит так. В этом фрагменте мой диапазон ввода составляет от 0 до 90000. Таким образом, ввод 90000 должен соответствовать 32767 и т. Д .:
uint16_t scaled_estimate = 0;
uint32_t input = 85000;
uint32_t max_base = 90000;
uint16_t new_base = INT16_MAX; // 32767
uint16_t scaled_estimate = (input * new_base) / max_base;
if(scaled_estimate > new_base) scaled_estimate = new_base; // clamp
Есть ли лучший способ добиться такого масштабирования на встроенных платформах или я должен доверять компилятору делать правильные вещи?