Java 为什么两个字节上的xor运算符会产生一个int? //键和散列都是字节[] int leftPos=0,rightPos=31; while(leftPos

Java 为什么两个字节上的xor运算符会产生一个int? //键和散列都是字节[] int leftPos=0,rightPos=31; while(leftPos,java,casting,byte,numeric,xor,Java,Casting,Byte,Numeric,Xor,为什么Java中对两个字节的按位操作会返回int?我知道我可以将其转换回字节,但这似乎很愚蠢。在两个字节上没有Java逐位操作。您的代码隐式地、静默地将这些字节转换为更大的整数类型(int),结果也是该类型 您现在可能会质疑对未定义的字节保留按位操作的合理性。因为语言规范这么说。它没有给出任何理由,但我怀疑这些是最可能的意图: 有一个小而简单的规则集来涵盖涉及所有可能类型组合的算术运算 为了实现高效,CPU内部使用32位整数,其他一切都需要显式或隐式转换 这是人们已经指出的一个类似问题的答案:

为什么Java中对两个字节的按位操作会返回int?我知道我可以将其转换回字节,但这似乎很愚蠢。

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


您现在可能会质疑对未定义的字节保留按位操作的合理性。

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

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

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


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

              //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?”操作不是未定义的;事实上,它们的定义相当清楚。只是结果是一个int,在没有显式强制转换的情况下无法存储在byte[]中。最可能的原因是使用本机32位CPU操作。这些示例中没有一个包含按位运算符,据我所知,它不会导致溢出/下溢。
      byte a = (byte) 0xDE; 
      byte b = (byte) 0xAD;
      byte r = (byte) ( a ^ b);