3

私はこのコードを持っています:

int i = 255;
byte b = (byte) i;
int c;
System.out.println(Integer.toBinaryString( i));
System.out.println("b = " + b); // b = -1
c=b>>>1;
System.out.println(Integer.toBinaryString( c));
System.out.println(c);

しかし、私はそれがどのように機能するのか理解できません。unsigned へのシフト255(11111111)は私に与えるべきだと思います127(0111111)が、そうではありません。私の仮定は間違っていますか?

4

3 に答える 3

2

>>>s の操作を含むシフト演算子int。の値はb、符号が付けられている-1ため、シフトの前にbyte昇格されます。intだからこそ、あなたは目に見える結果を見るのです。

255が再解釈される理由-1は、255 の 8 ビットすべてが 1 に設定されているためです。それを の符号付き 8 ビット型に代入すると、2 の補数規則に従うbyteと解釈されます。-1

于 2014-03-16T09:59:35.190 に答える
1

これを試してみると、次のことが理解できます。

System.out.println(Integer.toBinaryString(i)); // 11111111
System.out.println(Integer.toBinaryString(b)); // 11111111111111111111111111111111
System.out.println(Integer.toBinaryString(c)); // 1111111111111111111111111111111

変数int iは 255 に等しいので、最初の出力は理にかなっています。

byte b255 を 1 バイトに格納するため、変数は -1 に等しくなります。

  • しかし、 を呼び出すInteger.toBinaryString(b)と、コンパイラは から 、および に変換bするためbyte、2 番目の出力が表示されます。int(int)-1 == FFFFFFFFh == 11111111111111111111111111111111b

変数は にint c等しいb>>>1ので、3 番目の出力は理にかなっています。

于 2014-03-16T10:11:32.493 に答える
1

これが期待される結果を得る方法です

c = (0xFF & b) >>> 1;

詳細については、dasblinkenlight の回答を参照してください

于 2014-03-16T10:01:45.233 に答える