では、何が起こっているのかを詳しく説明しましょう。明確にするためのバイナリ表記には、先頭に 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
、符号ビットが設定されていない と同じです。シフトの後、0b1111111100
1020 に等しい が得られますが、これもシフトが回転しないためです。物事が少し明確になることを願っています。ビット シフトと AND/OR ロジックを実行する場合は、通常、前述のように符号なしの型を使用する必要があります。