当前位置:  开发笔记 > 编程语言 > 正文

使用按位运算符的Misra违例

如何解决《使用按位运算符的Misra违例》经验,为你挑选了1个好方法。

我写了以下MISRA不喜欢的代码:

UartPtr->C &= ((uint8_t)(~SIO_C2_SBK));

#define SIO_C2_SBK ((uint8_t)0x01u)

并被UartPtr定义为

UartPtr = (UartStruct*) 0x12345678; /* I know that this is also a violation of MISRA */

与基础数据结构:

typedef volatile struct UartStructTag
{
  uint8_t      BDH;
  uint8_t      BDL;
  uint8_t      C1;
  uint8_t      C2;
} UartStruct;

我的Misra检查员抱怨第一行,并说明

具有负值的整数常量表达式将转换为无符号类型.

但是,以下行不会导致MISRA出现问题:

UartPtr->C |= ((uint8_t)(SIO_C2_SBK));

所以问题来自于逐位否定.但由于所有操作都直接转换为uint8_t,因此我不会违反MISRA标准.谁想帮助我呢?



1> fuz..:

在任何算术表达式中,小于的类型的值在处理之前int被隐式转换为int.C语言不能对小于的类型进行算术运算int.因此,您的代码实际上表现如下:

UartPtr->C &= ((uint8_t)(~(int)(uint8_t)0x01u));

这只是

UartPtr->C &= ((uint8_t)(~1));

哪里~1-2两个补码架构的价值.

要解决此问题,请转换为unsigned大于或等于int应用按位之前的任何其他无符号类型:

UartPtr->C &= ((uint8_t)(~(unsigned)SIO_C2_SBK));

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有