Должен ли я разыгрывать во всех таких случаях? Кастинг чувствует, что я делаю что-то не так.
Это правильная вещь, по крайней мере, если код должен быть переносимым. Если он когда-либо компилируется только для 16-битных платформ, не должно быть предупреждения, в противном случае отключите предупреждение с явным приведением к uint16_t
:
uint16_t value = (uint16_t) (x + 1) * y;
Нет ничего лучше, что вы можете сделать: все арифметические операции выполняются как (по крайней мере) int
, и компилятор напоминает вам об этом. В зависимости от значений x
и y
вполне возможно, что результат не помещается в uint16_t
. Явно записывая приведенные документы, вы знаете об этом и либо хотите усечение, либо заверяете, что этого не произойдет.