次のコード:
unsigned char result;
result = (result << 4 );
-Wconversion フラグを指定して gcc バージョン 4.6.4 (Debian 4.6.4-2) でコンパイルすると、警告が表示されます
警告: 'int' から 'unsigned char' への変換により、その値が変更される可能性があります [-Wconversion]
何故ですか?
基準がそう言っているからです。2 項演算子のオペランドは、整数の昇格を受けます。この場合、 an より小さいものはすべて に
int
昇格されint
ます。操作の結果にも型int
があります。また、元の値がたとえば だった
0x12
場合、結果は になり0x120
、これを に代入する
unsigned char
と値が変化します。(割り当てられた値は になります0x20
。)その後、警告が表示されます。
編集:
標準から (§5.8 シフト演算子): "オペランドは整数型またはスコープなしの列挙型である必要があり、整数昇格が実行されます。結果の型は、昇格された左オペランドの型です。" 他の二項演算子とは異なり
、2 つの演算子から共通の型を見つける努力はありません。結果の型は、左側のオペランドであるピリオドの型です。ただし、整数昇格は引き続き発生します。unsigned char
int
unsigned int
int
すべての算術演算子と論理演算子は、引数に対して「整数昇格」を実行します。インテグラル プロモーションは、より小さいint
( のようなunsigned char
) 型をint
orに変換しunsigned int
ます。<<
に置き換えても同じことがわかります+
。
ああ、括弧は必要ありません。