tags:

views:

507

answers:

5
        //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--;
        }

Why would a bitwise operation on two bytes in Java return an int? I know I could just cast it back to byte, but it seems silly.

+2  A: 

every arithmetic operation on bytes promotes them to int.

GregS
I believe the question was "Why?", not "What?"
Michael Myers
The why is because the specification says so (The same is the case in C#, btw, see Jon Skeet's and Eric Lippert's replies here: http://stackoverflow.com/questions/941584/byte-byte-int-why)
0xA3
+1  A: 

There is no Java bitwise operations on two bytes. Your code implicitly and silently converts those bytes to a larger integer type (int), and the result is of that type as well.

You may now question the sanity of leaving bitwise operations on bytes undefined.

Victor Nicollet
Again, the question was *why* this happens.
Michael Myers
That is why it happens, the question I think you're looking for is "Why did they decide to leave bitwise operators on the byte type undefined necessitating the implicit cast to int?"
mletterle
The operations are *not* undefined; in fact they are defined quite clearly. It's just that the result is an int and cannot be stored in a byte[] without explicit casting.
Michael Borgwardt
+5  A: 

Because the language spec says so. It gives no reason, but I suspect that these are the most likely intentions:

  • To have a small and simple set of rules to cover arithmetic operations involving all possible combinations of types
  • To allow an efficient implementation - 32 bit integers are what CPUs use internally, and everything else requires conversions, explicit or implicit.
Michael Borgwardt
Using native 32bit CPU operations is the most likely reason.
mletterle
A: 

This was somewhere down in the answers to one of the similar questions that people have already pointed out:

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

Licky Lindsay
None of those examples include a bitwise operator, which to my knowledge can not cause overflow/underflow.
Kavon Farvardin
A: 

If it's correct and there are no value that can cause this loss of precision, in other words : "impossible loss of precision" the compiler should shut up ... and need to be corrected, and no cast should be added in this :

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

-- http://rzr.online.fr/q/java

rzr