инструмента статического анализа я использую поднимает предупреждение для этого кода:Cast от «Int» на «неподписанный короткий» после применения оператора побитового «~»
uint16 var1 = 1U;
uint16 var2 = ~var1;
я проверяю MISRA C правило 2004 и я нахожу 10.5 правила :
Если битовые операторы и ~ < < применяются к операндом од базового типа символ без знака или без знака короткого, результат должен быть немедленно отбрасываемой к базовому типу из операнда.
Хорошо, это не проблема, применяется неявное приведение (я думаю, что «приведение» означает неявное или явное приведение). Но правило 10.1 гласит:
Значение выражения целочисленного типа не должно быть неявно преобразовано в другой базовый тип, выражение является сложным.
предыдущий пример сложной операции являются: ~ u16a
я изменить мой код:
uint16 var1 = 1U;
uint16 var2 = (uint16) ~var1;
И я получаю еще одно предупреждение: Я думаю, что преобразование Int отрицательное значение беззнаковое значение INT не безопасно. Я проверяю стандарт C99 (ISO C99) § 6.3.1.3, но я не понимаю, являются ли четкие преобразования int - неподписанным коротким.
В EmbeddedGurus article Я читаю:
c = (unsigned int) a; /* Since a is positive, this cast is safe */
Мои вопросы:
- Есть явное преобразование из подписанную INT к беззнаковое короткое неопределенное поведение?
- Если да, то как использовать оператор дополнения с unsigned short безопасным способом?
[здесь] (http://stackoverflow.com/questions/25989343/how-is-shift-operator-evaluated-in-c) - некоторые полезные ответы, объясняющие числовое продвижение – chouaib