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中两个字节的按位运算会返回一个int?我知道我可以将它转换回字节,但这似乎很愚蠢。

4

4 回答 4

20

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

  • 有一套小而简单的规则来涵盖涉及所有可能的类型组合的算术运算
  • 为了实现有效的实现 - CPU 在内部使用 32 位整数,而其他所有内容都需要显式或隐式转换。
于 2010-01-04T23:34:58.083 回答
5

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

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

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

您现在可能会质疑未定义字节的按位操作是否合理。

于 2010-01-04T23:23:36.710 回答
0

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

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

于 2010-01-04T23:48:41.030 回答