6

次のコード:

unsigned char result;
result = (result << 4 );

-Wconversion フラグを指定して gcc バージョン 4.6.4 (Debian 4.6.4-2) でコンパイルすると、警告が表示されます

警告: 'int' から 'unsigned char' への変換により、その値が変更される可能性があります [-Wconversion]

何故ですか?

4

3 に答える 3

8

基準がそう言っているからです。2 項演算子のオペランドは、整数の昇格を受けます。この場合、 an より小さいものはすべて に int昇格されintます。操作の結果にも型intがあります。また、元の値がたとえば だった 0x12場合、結果は になり0x120、これを に代入する unsigned charと値が変化します。(割り当てられた値は になります0x20。)その後、警告が表示されます。

編集:

標準から (§5.8 シフト演算子): "オペランドは整数型またはスコープなしの列挙型である必要があり、整数昇格が実行されます。結果の型は、昇格された左オペランドの型です。" 他の二項演算子とは異なり 、2 つの演算子から共通の型を見つける努力はありません。結果の型は、左側のオペランドであるピリオドの型です。ただし、整数昇格は引き続き発生します。unsigned charintunsigned intint

于 2013-07-05T13:16:11.877 に答える
0

すべての算術演算子と論理演算子は、引数に対して「整数昇格」を実行します。インテグラル プロモーションは、より小さいint( のようなunsigned char) 型をintorに変換しunsigned intます。<<に置き換えても同じことがわかります+

ああ、括弧は必要ありません。

于 2013-07-05T13:20:46.857 に答える