代码是:
*(buf+2) |= (unsigned char)(mFlag & 0x7f);
buf
为unsigned char *
,mFlag
为unsigned char
我想这是因为operator|=
的返回值,所以我得到了警告
警告:从'int'转换为'unsigned char'可能会改变其值
如何删除警告?归因于operator|=
?
答案 0 :(得分:4)
在C中,所有算术(包括&
)的类型至少与int
一样宽。因此,表达式的结果将始终为int
或unsigned
,具体取决于常量的类型。
由于常量0x7f
显然在任何字符类型的范围内,编译器提供的警告实际上并没有真正帮助,我甚至认为它是一个错误。
你唯一能做的就是
*(buf+2) = (unsigned)*(buf+2) | 0x7FU;
即将值明确转换为更宽的类型。如果这仍然给你一个警告,使用
*(buf+2) = (unsigned char)((unsigned)*(buf+2) | 0x7FU);
但是您应该明确考虑升级编译器或更改您使用的警告选项。
答案 1 :(得分: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);
C版本(也适用于C ++)将使用不同的内联函数,因为C没有模板:
inline unsigned char to_unsigned_char (unsigned char x) { return x; }
/* ... */
*(buf+2) |= mFlag & to_unsigned_char(0x7f);
答案 2 :(得分:0)
如果警告通过将常量声明为无符号
,则应该能够摆脱*(buf+2) |= (mFlag & 0x7fu);
答案 3 :(得分:0)
正如@chris所说,它可能会抛出屏蔽的结果(当-Wconversion
标志打开时会收到警告)
我会使用*(buf+2) = (unsigned char)((mFlag & 0x7f) | *(buf+2));
,但如果您坚持使用|=
,则可以利用复合文字(仅适用于C99):
*(buf+2) |= (unsigned char){mFlag & 0x7f};