30
        //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 を返すのはなぜですか? キャストしてバイトに戻すことができることはわかっていますが、ばかげているようです。

4

4 に答える 4

5

それが正しく、この精度の損失を引き起こす可能性のある値がない場合、つまり、「不可能な精度の損失」コンパイラはシャットダウンする必要があります...そして修正する必要があり、これにキャストを追加する必要はありません:

byte a = (byte) 0xDE; 
byte b = (byte) 0xAD;
byte r = (byte) ( a ^ b);
于 2010-02-10T15:22:19.400 に答える
2

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

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

于 2010-01-04T23:23:36.710 に答える
0

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

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

于 2010-01-04T23:48:41.030 に答える