首页 > 解决方案 > 按位移位 (varUint8 >> 7) & 0x01u - Misra 兼容

问题描述

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

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

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

标签: cembeddedmisra

解决方案


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

有关详细信息,请参阅隐式类型提升规则


推荐阅读