繁体   English   中英

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

[英]warning: conversion to 'unsigned char' from 'int' may alter its value

代码是:

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

bufunsigned char *mFlagunsigned char

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

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

如何删除警告? 是由于operator|=吗?

在C语言中,所有算术运算符(包括& )的类型至少与int一样宽。 因此,根据常量的类型,表达式的结果将始终为intunsigned

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

您唯一可以做的就是

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

那就是将值显式转换为更广泛的类型。 如果这样仍然给您警告,请谨慎使用

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

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

要删除警告,您显然需要一个临时变量来保存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没有模板,因此AC版本(也适用于C ++)将使用其他内联函数:

inline unsigned char to_unsigned_char (unsigned char x) { return x; }
/* ... */
*(buf+2) |= mFlag & to_unsigned_char(0x7f);

通过将常量声明为unsigned可以消除警告

*(buf+2) |= (mFlag & 0x7fu);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM