C++ 为什么按位求反运算符“~&引用;转换为int?(从‘;int’;转换为‘;无符号字符’;可能会改变其值)

C++ 为什么按位求反运算符“~&引用;转换为int?(从‘;int’;转换为‘;无符号字符’;可能会改变其值),c++,type-conversion,bit-manipulation,compiler-warnings,C++,Type Conversion,Bit Manipulation,Compiler Warnings,GCC 4.9.1报告“警告:从'int'转换为'unsigned char'可能会改变其值[-Wconversion]”,代码如下 #include <cstdlib> int main( int , char*[] ) { unsigned char *dest = new unsigned char[16]; const unsigned char *src = new unsigned char[16]; for( size_t i = 0; i != 16;

GCC 4.9.1报告“警告:从'int'转换为'unsigned char'可能会改变其值[-Wconversion]”,代码如下

#include <cstdlib>

int main( int , char*[] ) {
  unsigned char *dest = new unsigned char[16];
  const unsigned char *src = new unsigned char[16];
  for( size_t i = 0; i != 16; ++i) {
    dest[i] = ~(src[i]);
  }
  return 0;
}
#包括
int main(int,char*[]){
无符号字符*dest=新的无符号字符[16];
const unsigned char*src=新的unsigned char[16];
对于(尺寸i=0;i!=16;++i){
dest[i]=~(src[i]);
}
返回0;
}
显然,
src
dest
都是指向
无符号字符数组的指针,我只希望后者是前者的位求反。由于某种奇怪的原因,
~
运算符似乎返回一个
int
,从而触发警告。为什么?这是故意的行为吗


当然,我知道我可以使用一个
static_cast()
来防止警告,但我觉得有些地方出了问题,警告不应该出现在那里。

表达式中的所有操作数都被提升到至少
int
s,因为
int
应该表示给定架构的“自然”整体类型

因此,这个警告是正确的-任务右侧的类型将是
int
(对于某些人来说,它可能表示优化的位置*),
static\u cast
是一个很好的解决方案(我将为
0xFF
添加掩码,以确保正确地陈述我的意图)


*)例如:一次可以对4个字节求反,从而更好地利用CPU。有些编译器可能自己做这件事

我猜字面上的答案是因为标准这么说。从[expr.unary.op]:

~
的操作数应为整数或无范围枚举类型;结果是其操作数的补数。执行整体促销结果的类型是提升的操作数的类型。

根据[conv.prom]的说法,这是:

整数类型的PR值,而不是其整数转换的
bool
char16\u t
char32\u t
wchar\u t
秩(4.13)小于
int
的秩,如果
int
可以表示所有值,则可以将其转换为
int
类型的PR值 源类型的值;否则,可以将源prvalue转换为类型为
unsigned int
的prvalue

int
的秩高于
无符号字符
。是的,这是预期的行为,一个明确的
static\u cast
消除了警告