これはコードです:
char x=-1>>2;
printf("%d",x);
私がやってもx = -N>>2
それは与える1
だけです。
x = -1 => 11111111
x= -1>>2 ==> 00111111 = 3F ??
また、intを実行してもx = -1>>2
、出力はになります1
。
この計算がどのように行われるか説明していただけますか?
負の値の右シフトは実装によって定義されます。
あなたの場合、あなたが見ている右シフトの振る舞いは、サインを保存することです。
考えてみてくださいchar x = -38;
。以下は、符号を保持するときにビットシフトがどのように機能するかを示しています。
x 11011010
x >> 1 11101101
x >> 2 11110110
x >> 3 11111011
etc...
あなたが使用すればあなたのコードはうまくいくと思います
unsigned char x=-1>>2;
符号付き数値(文字を含む)の場合、右シフトはゼロを追加しません。これは符号ビット拡張と呼ばれます。Cは、2の補数形式を使用して負の数を格納します。負の数の場合、この形式の符号ビット(MSB)は1であり、操作中に埋め込まれます。符号なしの番号を使用すると、問題が修正されます。