2015-08-28 89 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。所以是的,這是預期的行爲,並且明確規定了警告。