Cでは、(char) 0xFFを8だけ左シフトしてintにキャストします。
質問
(char) 0xff を 8 だけ左シフトして int にキャストすると、-256 または 0xffffff00 が得られます。なぜこれが起こるのか誰か説明できますか?
#include <stdio.h>
int main (void)
{
char c = 0xff;
printf("%d %x\n", (int)(c<<8),(int)(c<<8));
return 0;
}
出力は
-256 ffffff00
解決
char
は、符号付きまたは符号なしすることができます - それは実装定義です。 char
は、コンパイラではデフォルトで署名されているので、あなたは、これらの結果を参照してください。
signed char型0xFFのためには、に対応-1(すなわち、どのように2の補数作品です)。あなたはそれをシフトしようとすると、それは最初int
に昇格してからシフトしている - あなたは、効果的に256で乗算を取得
だから、このコードです。
char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );
他のヒント
私が最初にこの問題を調べたとき、私の最初の見解は、char 'c' を 8 ビット左にシフトする必要があるということでした。8 ビットはすべて破棄され、空の char は値 0 の int にキャストされます。
少し調査すると明らかになります 通常の単項変換 - これは、多数の算術型を削減するための場所であり、変換は単項演算子の '!'、'-'、'~'、および '*' 演算子のオペランドに自動的に適用されます。 そして 二項演算子「<<」および「>>」の各オペランドに適用されます。
したがって、char 'c' は int に変換されます。 初め, 、次に左にシフトすると、表示されている答えが得られます。
毎日何か新しいことを学びます!
cがint型に推進されています。あなたの実装は、デフォルトで署名した文字を作ると仮定すると、これはあなたが、あなたの結果を与えるために左にシフトさは0xffffffffを、取得するつもりだ意味します。
あなたはunsigned char型にCを作る場合は、、あなたが期待するものを手に入れる必要があります。
charが何もなく、signed char型ではありません。だから、文字C = 0xFFでは次のようになります-1。あなたは8ビットでシフトを-1去ったとき、あなたが-256を取得します。