3

代码是:

*(buf+2) |= (unsigned char)(mFlag & 0x7f);

bufunsigned char *mFlagunsigned char

我想这是因为返回值operator|=使我收到警告

警告:从“int”转换为“unsigned char”可能会改变其值

如何删除警告?是因为operator|=?

4

4 回答 4

5

在 C 中,所有算术(包括&)都以至少与int. 因此,表达式的结果将始终是intunsigned取决于常量的类型。

由于常量0x7f显然在任何字符类型的范围内,编译器给出的警告实际上并没有真正的帮助,我什至认为它是一个错误。

你唯一能做的就是

*(buf+2) = (unsigned)*(buf+2) | 0x7FU; 

那就是将值显式转换为更广泛的类型。如果这仍然给您一个分配使用的警告

*(buf+2) = (unsigned char)((unsigned)*(buf+2) | 0x7FU);

但是您应该明确地考虑升级您的编译器或更改您使用的警告选项。

于 2013-07-24T06:11:25.963 回答
0

要删除警告,您显然需要一个临时变量来保存该0x7f值。

unsigned char x = 0x7f;
*(buf+2) |= mFlag & x;

问题似乎是编译器正在处理任何将文字转换为unsigned char通过强制转换导致警告的尝试(进一步讨论表明这是特定于|=运算符的,简单的分配似乎没有问题)。但是,允许在没有警告的情况下初始化变量。

另一种解决方法是定义一个内联函数来实现与强制转换相同的目的。我使这个函数看起来类似于 C++ static_cast<>

template <typename T>
inline T static_conversion (T x) { return x; }
//...
*(buf+2) |= mFlag & static_conversion<unsigned char>(0x7f);

AC 版本(也适用于 C++)将使用不同的内联函数,因为 C 没有模板:

inline unsigned char to_unsigned_char (unsigned char x) { return x; }
/* ... */
*(buf+2) |= mFlag & to_unsigned_char(0x7f);
于 2013-07-24T03:10:43.897 回答
0

应该能够通过将常量声明为无符号来摆脱警告

*(buf+2) |= (mFlag & 0x7fu);
于 2013-07-24T03:39:06.967 回答
0

正如@chris 所说,它可能正在投射掩蔽的结果(当-Wconversion标志打开时你会收到警告)

我会使用*(buf+2) = (unsigned char)((mFlag & 0x7f) | *(buf+2));,但如果您坚持使用|=,您可以利用复合文字(仅适用于 C99):

*(buf+2) |= (unsigned char){mFlag & 0x7f};
于 2013-07-24T05:47:50.923 回答