Java 为什么两个字节上的xor运算符会产生一个int? //键和散列都是字节[] int leftPos=0,rightPos=31; while(leftPos
为什么Java中对两个字节的按位操作会返回int?我知道我可以将其转换回字节,但这似乎很愚蠢。在两个字节上没有Java逐位操作。您的代码隐式地、静默地将这些字节转换为更大的整数类型(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位整数,其他一切都需要显式或隐式转换 这是人们已经指出的一个类似问题的答案:
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);