为什么两个字节上的异或运算符会产生一个 int?

2022-09-01 12:10:12
        //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 中对两个字节进行按位运算会返回一个 int?我知道我可以把它放回字节,但这似乎很愚蠢。


答案 1

因为语言规范是这么说的。它没有给出任何理由,但我怀疑这些是最有可能的意图:

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

答案 2

如果它是正确的,并且没有值会导致这种精度损失,换句话说:“不可能的精度损失”编译器应该闭嘴......并且需要更正,并且不应在此中添加任何强制转换:

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