按位移位(varUint8 >> 7)&0x01u-符合Misra

时间:2019-04-12 12:05:06

标签: c embedded misra

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

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

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

1 个答案:

答案 0 :(得分:2)

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

有关更多信息,请参见Implicit type promotion rules