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

时间:2010-01-04 23:17:11

标签: java casting byte 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--;
        }

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

4 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

两个字节上没有Java按位运算。您的代码隐式且静默地将这些字节转换为更大的整数类型(int),结果也是该类型。

您现在可能会质疑在未定义的字节上保留按位运算的合理性。

答案 3 :(得分:0)

在人们已经指出的类似问题之一的答案中,这是某个地方:

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