为什么两个字节的xor运算符产生一个int?

def*_*alt 29 java byte casting numeric xor

        //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--;
        }
Run Code Online (Sandbox Code Playgroud)

为什么Java中的两个字节的按位运算会返回一个int?我知道我可以把它转回到字节,但它看起来很傻.

Mic*_*rdt 20

因为语言规范是这样说的.它没有理由,但我怀疑这些是最可能的意图:

  • 有一套简单的小规则来涵盖涉及所有可能的类型组合的算术运算
  • 为了实现高效实现 - 内部使用CPU的是32位整数,其他所有内容都需要显式或隐式转换.

  • 使用本机32位CPU操作是最可能的原因. (3认同)

RzR*_*RzR 5

如果它是正确的并且没有可能导致精度损失的值,换句话说:"不可能的精度损失"编译器应该关闭......并且需要纠正,并且不应该添加强制转换:

byte a = (byte) 0xDE; 
byte b = (byte) 0xAD;
byte r = (byte) ( a ^ b);
Run Code Online (Sandbox Code Playgroud)