2009-07-08 11 views

答えて

14

charは、実装定義された署名付きまたは符号なしである可能性があります。コンパイラでは、charがデフォルトで署名されているため、これらの結果が表示されます。

署名されたchar 0xFFは-1に対応します(これは2の補数の仕組みです)。あなたはそれをシフトしようとすると、最初intに昇格された後、シフト - あなたが効果的に256

による乗算を取得するだから、このコードです:

char c = 0xFF; // -1 
int shifted = c << 8; //-256 (-1 * 256) 
printf("%d, %x", shifted, shifted); 
1

charは何もなく、signed char型ではないです。したがって、char c = 0xFFは-1になります。シフト-1を8ビット左にしたときに-256を得ます。

+11

charのsignednessは実装定義です。 –

3

cは前にint型に推進されているがシフト操作が行われる。あなたの実装がデフォルトでcharsを署名すると仮定すると、これは0xffffffffを得ることを意味し、次に左にシフトして結果を与えます。

cをunsigned charにすると、期待通りの結果が得られます。

7

私が初めて問題を見たとき、私の最初の見解では、char 'c'は8ビット左にシフトする必要がありました.8ビットすべてが破棄され、空のcharは値0のintにキャストされます。

通常の単項変換 - これは、多数の算術型を削減する場所で、変換は単項「!」、「 - 」、「〜」、「*」のオペランドに自動的に適用されます。演算子およびを、バイナリ '< <'および '>>'演算子の各オペランドに割り当てます。

したがって、char 'c'は、の最初のに変換され、次に左にシフトして表示されます。

あなたは毎日何か新しいことを学びます!

関連する問題