Смещение вправо 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 не допускает неявного присвоения более крупных типов меньшим.
Для получения дополнительной информации см. Правила неявного продвижения типов .