按位移位 (var Uint8 >> 7) & 0x01u - Misra 兼容

Bitwise shift ( varUint8 >> 7) & 0x01u - Misra complient

我正在对一些代码进行故障排除,我遇到了这一行

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

我想知道正确的做法是什么。考虑到我将 uint8 向右移动 7 位数字,在编写符合 MISRA 的代码时,& 0x01u 是否需要正确实施?

右移 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 不允许从较大类型到较小类型的隐式赋值。

有关详细信息,请参阅