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

thu*_*ium 3 c c++ gcc warnings

代码是:

*(buf+2) |= (unsigned char)(mFlag & 0x7f);
Run Code Online (Sandbox Code Playgroud)

bufunsigned char *并且mFlagunsigned char

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

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

我怎样才能消除警告?是因为operator|=吗?

Jen*_*edt 5

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

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

你唯一能做的就是

*(buf+2) = (unsigned)*(buf+2) | 0x7FU; 
Run Code Online (Sandbox Code Playgroud)

也就是说,将值显式转换为更广泛的类型。如果这仍然给您一个转让人使用的警告

*(buf+2) = (unsigned char)((unsigned)*(buf+2) | 0x7FU);
Run Code Online (Sandbox Code Playgroud)

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