Побитовый сдвиг (varUint8 >> 7) & 0x01u - соответствует Misra - PullRequest
1 голос
/ 12 апреля 2019

Я устраняю неисправность некоторого кода, и я столкнулся с этой строкой

uint8var = ((constUint8[0]) >> 7) & 0x01u;

Мне было интересно, какова правильная практика в этом. & 0x01u необходим для правильной реализации при написании кода, совместимого с MISRA, учитывая, что я смещаю uint8 на 7 цифр вправо?

1 Ответ

2 голосов
/ 12 апреля 2019

Смещение вправо uint8_t само по себе никогда не может быть проблематичным.Тем не менее, MISRA-C стремится заблокировать вас от написания ошибок, вызванных неявным целочисленным продвижением.В вашем случае constUint8[0] будет неявно повышен до int, который подписан.Это вызовет различные проблемы с соответствием MISRA, которых проще всего избежать, если убедиться, что ваш код не содержит неявных повышений в первую очередь.

Когда речь идет о сдвигах, это означает приведение к большому целому типу перед сдвигом:
(uint32_t)constUint8[0] >> 7.

Маска с 0x01u является излишней и не добавляет значения.Это можно безопасно удалить.Чтобы достичь соответствия требованиям MISRA-C, лучше всего переписать код следующим образом:

uint8var = (uint8_t) ((uint32_t)constUint8[0] >> 7);

, где приведение (uint8_t) гарантирует отсутствие неявного преобразования, но мы явно возвращаемся кпредполагаемый тип.MISRA-C не допускает неявного присвоения более крупных типов меньшим.

Для получения дополнительной информации см. Правила неявного продвижения типов .

...