Инструмент статического анализа, который я использую, вызывает предупреждение для этого кода:
uint16 var1 = 1U;
uint16 var2 = ~var1;
Я проверяю правила MISRA C 2004, и я нахожу правило 10.5:
Если побитовые операторы ~ и < применяются к операнду od base type unsigned char или unsigned short, результат должен быть немедленно перенесен в базовый тип операнда.
Хорошо, это не проблема, применяется неявное приведение (я думаю, что "cast" означает неявное или явное приведение). Но правило 10.1 гласит:
Значение выражения целочисленного типа не должно быть неявно преобразовано в другой базовый тип, выражение является сложным.
Предыдущий пример сложной операции: ~ u16a
Я меняю свой код на:
uint16 var1 = 1U;
uint16 var2 = (uint16) ~var1;
И я получаю другое предупреждение: я думаю, что преобразование значения int negative в значение unsigned int небезопасно. Я проверяю стандарт C99 (ISO C99) § 6.3.1.3, но я не понимаю, ясно ли указано преобразование int в unsigned short.
В статье EmbeddedGurus Я читал:
c = (unsigned int) a; /* Since a is positive, this cast is safe */
Мои вопросы:
- Явное преобразование из подписанного int в неподписанное короткое неуказанное поведение?
- Если да, как безопасно использовать оператор дополнения с unsigned short?