警告:从'int'转换为'unsigned char'可能会更改其值
warning: conversion to 'unsigned char' from 'int' may alter its value
代码为:
*(buf+2) |= (unsigned char)(mFlag & 0x7f);
buf
是unsigned char *
,mFlag
是unsigned char
我想是因为operator|=
的返回值,所以我得到了警告
警告:从"int"转换为"unsigned char"可能会更改其值
如何删除警告?是因为operator|=
吗?
在C中,所有算术(包括&
)都是在至少与int
一样宽的类型中完成的。因此,表达式的结果将始终是int
或unsigned
,这取决于常量的类型。
由于常数0x7f
显然在任何字符类型的范围内,编译器给出的警告实际上都没有什么帮助,我甚至认为这是一个错误。
你唯一能做的就是
*(buf+2) = (unsigned)*(buf+2) | 0x7FU;
也就是说,将值显式转换为更宽的类型。如果这仍然会给你一个任务警告,请使用
*(buf+2) = (unsigned char)((unsigned)*(buf+2) | 0x7FU);
但是,您应该明确考虑升级编译器或更改您使用的警告选项。
应该能够通过将常量声明为无符号来消除警告
*(buf+2) |= (mFlag & 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版本(也适用于C++)将使用不同的内联函数,因为C没有模板:
inline unsigned char to_unsigned_char (unsigned char x) { return x; }
/* ... */
*(buf+2) |= mFlag & to_unsigned_char(0x7f);
正如@chris所说,它可能会投射掩蔽的结果(当-Wconversion
标志打开时,您会收到警告)
我会使用*(buf+2) = (unsigned char)((mFlag & 0x7f) | *(buf+2));
,但如果你坚持使用|=
,你可以利用复合文字(仅适用于C99):
*(buf+2) |= (unsigned char){mFlag & 0x7f};
您可以暂时禁用此警告,如下所示:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
*(buf+2) |= (mFlag & 0x7fu);
#pragma GCC diagnostic pop
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 将字符串中的 int 转换为字母;
- 主.cpp:18:20:错误:从"int*"转换为"int"会失去精度 [-fa
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- 如何将矢量<int>转换为字符数组?
- C++ 无法从 const int* 转换为 const_iterator
- 我不断收到错误 C2440'=':无法从"int *(__cdecl *)(int *,int *,int,int)"转换为"int *
- 如何将 int[4] 转换为 std::array<int,4>?
- 如何将data[i].int转换为vaible
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 将私有矩阵形式 int 转换为双 C++
- 无法将参数 1 从 'int' 转换为 'int &'
- 将 int 转换为字符串后始终得到 0
- isspace 函数的性能警告,从 int 转换为布尔值
- 将大 int 转换为浮点数,而不舍入 c++
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- 将未签名的INT转换为BCD
- 在 C++ 中将 int 转换为双精度