C++ 为什么按位求反运算符“~&引用;转换为int?(从‘;int’;转换为‘;无符号字符’;可能会改变其值)
GCC 4.9.1报告“警告:从'int'转换为'unsigned char'可能会改变其值[-Wconversion]”,代码如下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;
#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
消除了警告