我写了以下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标准.谁想帮助我呢?
在任何算术表达式中,小于的类型的值在处理之前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));