3

Javaでは、右シフト演算を実行する前に、バイト型が最初にint型に変換されることを私は知っています。

したがって、Javaでは、バイトタイプの>>>操作に対して誤った答えが返されます。

例えば、

byte b=(byte)0xf1;
byte c=(byte)(b>>4);
byte d=(byte)(b>>>4);
byte e=(byte)((b&0xff)>>4);

dの答えはcに等しい。しかし、eの答えは正しいです。理由が思いつかない。

ありがとう

4

3 に答える 3

1

すでに述べたように、Javaは常にints以上で計算するため、

考えてみてくださいb = 1111 0001(一番上のビットが設定されているので、b実際には-15です)

intへの暗黙のキャスト:
(int)b = 1111 .... 1111 0001

右シフトを行う:
(b>>4) = 1111 1111 .... 1111 1111
(b>>>4) = 0000 1111 .... 1111 1111

boolへの明示的なキャスト: c = d = 1111 1111


検討e=(byte)((b&0xff)>>4);

intへの暗黙のキャスト:
(int)b = 1111 .... .... 1111 0001

ANDと0xff:
x&0xff = 0000 .... 0000 1111 0001

右シフトを行う:
(b&0xff)>>4 = 0000 .... 0000 1111

バイトへの明示的なキャスト:
e = 0000 1111

于 2013-02-07T19:57:16.127 に答える
0

javaの最小の型はintです。これは、CPUが最近整数以上の型で動作するためです。その結果、JVMはintに基づいて実装され、byte、char、booleanなどの他の小さなデータ型は便宜上追加されました。

したがって、ビット演算を行うと、前述のような矛盾を楽しむことができます。

于 2013-02-07T19:51:07.863 に答える
0

「右シフト演算を行う前に、最初にint型に変換します」という質問に自分で答えたので、

byte e=(byte)((b&0xff)>>4);

まず第一に

b -> int => 0xfffffff1 

それから

0xfffffff1 & 0xff => 0xf1 

それから

0xf1 >> 4 => 0xf
于 2013-02-07T19:53:00.810 に答える