代码之家  ›  专栏  ›  技术社区  ›  defectivehalt

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

  •  29
  • defectivehalt  · 技术社区  · 16 年前
            //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 回复  |  直到 12 年前
        1
  •  20
  •   Michael Borgwardt    16 年前

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

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

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

    byte a = (byte) 0xDE; 
    byte b = (byte) 0xAD;
    byte r = (byte) ( a ^ b);
    
        3
  •  2
  •   Victor Nicollet    16 年前

    在两个字节上没有Java按位操作。您的代码隐式和静默地将这些字节转换为更大的整数类型( int ,结果也是这种类型的。

    现在您可能会质疑在字节上保留位操作的合理性。

        4
  •  0
  •   Licky Lindsay    16 年前

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

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