1

我在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 弹出这些错误:

  1. 位运算符不应应用于基础类型已签名的操作数 - #1393-D (MISRA-C:2004 10.1/R)

  2. 如果整数类型的表达式的值不是转换为具有相同符号的整数类型,则不应将其隐式转换为不同的基础类型。

我不想更改编译器 .h 文件,我想消除这些警告。

4

2 回答 2

1

猜测一下,您char是 8 位并且int(至少)是 16。这意味着 的所有值unsigned char都可以表示为 (signed) ints。反过来,这意味着在您的表达式REG2 |= 0x01;中,您的unsigned char将被提升为int,然后执行OR操作,然后将结果转换回unsigned char

如果我没记错的话,将常量更改为 anunsigned char应该可以防止:

REG2 |= (unsigned char)0x01;

或者:

unsigned char one = (unsigned char)0x01;

REG2 |= one;
于 2012-04-06T04:47:09.763 回答
1

你有没有尝试过:

REG2 |= 0x01U;

?

于 2012-04-06T06:46:04.117 回答