Этот вопрос иллюстрирует, почему -Wconversion
настолько переусердствовал, что в значительной степени бесполезен.
В C нет арифметических значений c меньше, чем int
. Например:
val0 += 0x7F;
оценивается так, как если бы это было
val0 = (int)val0 + 0x7F;
Присвоение обратно val0
без приведения, затем запускает -Wconversion
. В некотором смысле это законное предупреждение: оператор +
не переполняется, но возвращение результата может потерять часть результата, и компилятор скажет вам об этом (хотя и неловко).
Если вы Если вы собираетесь использовать -Wconversion
, вы по существу не можете использовать составной оператор присваивания (например, +=
) с типами, меньшими чем * int
. Вам нужно выписать эквивалентную форму и использовать приведение, чтобы указать, что вы намерены провести преобразование с потерями. Например, здесь вы могли бы написать:
val0 = (uint16_t)(val0 + 0x7F);
Я не думаю, что это ужасно хороший стиль, но некоторые стандарты / политики кодирования (я думаю, MISRA, например) требуют его.