web-dev-qa-db-ja.com

2バイトのxor演算子がintを生成するのはなぜですか?

        //key & hash are both byte[]
        int leftPos = 0, rightPos = 31;
        while(leftPos < 16) {
            //possible loss of precision. required: byte, found: int
            key[leftPos] = hash[leftPos] ^ hash[rightPos];
            leftPos++;
            rightPos--;
        }

Javaの2バイトに対するビット演算がintを返すのはなぜですか?バイトにキャストバックできることはわかっていますが、ばかげているようです。

30
defectivehalt

言語仕様がそう言っているからです。理由はありませんが、これらが最も可能性の高い意図であると思われます。

  • タイプのすべての可能な組み合わせを含む算術演算をカバーするための小さくて単純なルールのセットを持つこと
  • 効率的な実装を可能にするために-32ビット整数はCPUが内部で使用するものであり、他のすべては明示的または暗黙的な変換を必要とします。
20

それが正しく、この精度の低下を引き起こす可能性のある値がない場合、言い換えると、「不可能な精度の低下」コンパイラはシャットダウンする必要があります...そして修正する必要があり、これにキャストを追加しないでください:

byte a = (byte) 0xDE; 
byte b = (byte) 0xAD;
byte r = (byte) ( a ^ b);
5
RzR

2バイトにはJavaビット単位の演算はありません。コードは暗黙的かつサイレントにそれらのバイトをより大きな整数型(int)に変換し、結果もその型になります。 。

ここで、バイトに対するビット演算を未定義のままにしておくことの正気性に疑問を呈するかもしれません。

2
Victor Nicollet

これは、人々がすでに指摘している同様の質問の1つに対する回答のどこかにありました。

http://blogs.msdn.com/oldnewthing/archive/2004/03/10/87247.aspx

0
Licky Lindsay