我在Code Composer Studio中使用MISRA C 2004标准。在外设初始化期间,我总是会遇到按位操作的错误。
在编译器.h文件中,定义是这样的。
#define SFR_8BIT(addr) extern volatile unsigned char addr
SFR_8BIT(REG1);
#define REG2 REG1
现在在我的代码中,如果我使用
REG2 |= 0x01;
MISRA C正在突然出现这些错误:
按位运算符不适用于其基础类型已签名的操作数 - #1393-D(MISRA-C:2004 10.1 / R)
- 醇>
如果整数类型表达式的值不是转换为相同签名的整数类型,则不应将其隐式转换为不同的基础类型。
我不想更改编译器.h文件,我想根除这些警告。
答案 0 :(得分:1)
猜测一下,char
为8位,int
为(至少)16。这意味着unsigned char
的所有值都可以表示为(已签名){{1} }秒。反过来,这意味着在您的表达式int
中,您的REG2 |= 0x01;
将被提升为unsigned char
,然后执行int
操作,然后将该结果返回给OR
。
如果我没有弄错,将常量更改为unsigned char
可以防止:
unsigned char
或:
REG2 |= (unsigned char)0x01;
答案 1 :(得分:1)
你试过了吗?
REG2 |= 0x01U;