2015-08-28 87 views
0

GCC 4.9.1报告“警告:从'int'转换为'unsigned char'可能会改变它的值[-Wconversion]”,代码如下为什么bit-wise将运算符“〜”转换为int? (从'int'转换为'unsigned char'可能会改变它的值)

#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; 
} 

很显然,无论是srcdest都是指针的unsigned char一个数组,我只希望,后者是前者的逐位否定。出于一些奇怪的原因,~运营商似乎返回int,从而触发警告。为什么?这是预期的行为?

当然,我知道我可以使用static_cast<unsigned char>()来防止警告,但我觉得其他的东西是错的,警告不应该在那里。

回答

0

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

所以这个警告是正确的 - 类型上分配的右侧将int(对于一些人来说可能表明优化*的地方),static_cast是一个很好的解决方案(我要补充面具0xFF吧,刚需确定并正确地陈述我的意图)。例如:可以一次否定4个字节,更好地利用CPU。有些编译器可能会由他们自己完成。

2

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

~的操作数应具有整型或无范型枚举类型;结果是它的操作数的补码。积分促销被执行。 结果的类型是提升操作数的类型。

其中,根据[conv.prom]为:

boolchar16_tchar32_t,或wchar_t其整数变换以外的整数类型的prvalue 秩(4.13)小于如果int可代表所有 源类型的值,则可将int的排名转换为int类型的预值;否则,源值可以转换为unsigned int类型的值。

int的排名高于unsigned char。所以是的,这是预期的行为,并且明确规定了警告。