我正在对一些代码进行故障排除,并且遇到了这一行
uint8var = ((constUint8[0]) >> 7) & 0x01u;
我想知道正确的做法是什么。考虑到我将uint8向右移动7位,在编写符合MISRA规范的代码时,& 0x01u
是否对于正确实现是必需的?
答案 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。