0

私はビット演算に不慣れです。AND、OR、XOR、および2s補数の基本概念があります。しかし、私は次のコードに出くわし、出力を理解することができません。

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

int myInt;
myInt = 0xFFFFFFE2;
printf("%d\n", myInt);

int i = 0xff;
printf("%d\n", i<<2);

出力は次のとおりです。

-256、ffffff00
-30
1020

ここで何が起こっているのか理解するのを手伝ってください!

4

3 に答える 3

2
char c1 = 0xFF; // -1
int shifted = c1 << 8; //-256 (-1 * 256)

c1はシフト用にプロモートされるintため、まだ-1です。負intのsのシフトは実装定義ですが、実装はほとんどの場合と同じように動作し、unsignedビットパターンであるかのようにシフトするため、8桁左シフトは256による乗算。

printf( "%d, %x\n", shifted, shifted );
  -256, ffffff00

予想通り。2の補数の-256のビットパターンは0xFFFFFF00(32ビットints)です。

int myInt;
myInt = 0xFFFFFFE2;

そのビットパターンは2の補数で-30です

printf("%d\n",myInt);

int i = 0xff ;

これは255、255 * 4=1020です

printf("%d\n", i<<2);

  -30
  1020
于 2012-04-20T22:47:47.453 に答える
1

では、何が起こっているのかを詳しく説明しましょう。明確にするためのバイナリ表記には、先頭に 0b と左側の最上位ビットが付けられます。

char c1 = 0xFF; // -1

char c1 は 8 ビットの符号付き整数型で、0b11111111 int、short、char などの符号付き型の場合、左端のビットが符号ビットとして使用されます。符号付き型を格納するための最も一般的な標準である2 の補数では、すべてのビットが設定された符号付き整数は -1 に等しくなります。

int shifted = c1 << 8; //-256 (-1 * 256)

c1 は、シフトの前に符号付き整数に暗黙的にキャストされるため、-1 の int は0xffffffff. C のシフト演算子は回転しないシフトです。つまり、値の外側に「から」シフトされたビットはゼロに設定されます。シフト後、 が得られます0xffffff00。これは、2 の補数で -256 に等しくなります。

printf( "%d, %x\n", shifted, shifted );

int myInt;
myInt = 0xFFFFFFE2;
printf("%d\n",myInt);

2 の補数に従って出力される符号付き整数を読んでいます。

int i = 0xff ;
printf("%d\n", i<<2);

最初の i は0b11111111、符号ビットが設定されていない と同じです。シフトの後、0b11111111001020 に等しい が得られますが、これもシフトが回転しないためです。物事が少し明確になることを願っています。ビット シフトと AND/OR ロジックを実行する場合は、通常、前述のように符号なしの型を使用する必要があります。

于 2012-04-20T23:06:39.107 に答える
1

c1、myInt、および i を、宣言されたビット数で 2 進数で書き留めます。

それらに操作を適用します。

それに従ってください。

于 2012-04-20T22:52:01.843 に答える