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

Posted

技术标签:

【中文标题】为啥两个字节上的 xor 运算符会产生一个 int?【英文标题】:Why does the xor operator on two bytes produce an int?为什么两个字节上的 xor 运算符会产生一个 int? 【发布时间】:2011-01-01 11:02:03 【问题描述】:
        //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?我知道我可以将它转换回字节,但这似乎很愚蠢。

【问题讨论】:

供参考:java.sun.com/docs/books/jls/third_edition/html/… 和 java.sun.com/docs/books/jls/third_edition/html/…。我不知道原因,所以我没有发布答案。 第二。我找不到任何描述为什么会发生上述情况的内容,只是确实如此。 类型提升有几个原因。对于按位运算,它比几乎所有其他运算的意义要小得多,但是 - 为什么不呢?您可以随时将其投射回去。 因为 Java 已经过于冗长,无法再进行一次不必要的转换。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

这是人们已经指出的类似问题之一的答案:

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

【讨论】:

这些例子都不包含按位运算符,据我所知,它不会导致溢出/下溢。【参考方案3】:

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

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

【讨论】:

使用原生 32 位 CPU 操作是最可能的原因。【参考方案4】:

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

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

【讨论】:

再次,问题是为什么会发生这种情况。 这就是它发生的原因,我认为您正在寻找的问题是“为什么他们决定将位运算符留在未定义的字节类型上,从而需要隐式转换为 int?” 操作是not未定义的;事实上,它们的定义非常明确。只是结果是一个 int,如果没有显式转换,就不能存储在 byte[] 中。

以上是关于为啥两个字节上的 xor 运算符会产生一个 int?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 XOR 是组合哈希的默认方式?

Java - 使用 XOR 解密的字符串不产生原始/加密字符串

为啥我不能添加两个字节并获得一个 int,而我可以添加两个最终字节获得一个字节?

为啥通过 XOR 交换整数变量在一行中不起作用?

c语言计算为啥结果不对

为啥在计算哈希码时使用 xor 运算符? [复制]