Java 位运算转换为整数

Java 位运算转换为整数,java,Java,我有一些二进制操作没有像我预期的那样工作。 我有一个字节数组,前两个字节有以下值:0x5和0xE0。 我想把它们组合成一个整数值,应该是0x5E0。 我试着做: int val = (b[i]) << 8 | b[i+1]; int-val=(b[i])Try:int-val=((b[i]&0xff)问题是byte数据类型是有符号的。因此,b[i+1]在执行操作之前得到符号扩展,当它从b[i]获取或使用0x0500时变为0xfffffff0@RedRoboHood这是一样的,Up投

我有一些二进制操作没有像我预期的那样工作。 我有一个字节数组,前两个字节有以下值:0x5和0xE0。 我想把它们组合成一个整数值,应该是0x5E0。 我试着做:

int val = (b[i]) << 8 | b[i+1];

int-val=(b[i])Try:
int-val=((b[i]&0xff)问题是
byte
数据类型是有符号的。因此,
b[i+1]
在执行操作之前得到符号扩展,当它从
b[i]获取或使用
0x0500
时变为
0xfffffff0
@RedRoboHood这是一样的,
Up投票支持“不能像我期望的那样工作”部分,而不是常规的“不能正常工作”,就像有人突然发现严重的java bug一样。如果你使用的是java 8,还有
Byte.toUnsignedInt
。我不确定为什么会是“不幸的”;)@我不知道我是否发现有符号字节有用,但我知道我犯过错误,因为它们是有用的。我想我本可以省去这篇社论:-)。@MattiVirkkunen这是错误的。Java有7种基本类型,这已经很多了。使用unsigned,您将获得4个以上,但没有任何收益,因为当unsigned和signed混合使用时,没有合理的方法来定义行为。加上所有的铸造材料,你的“廉价外包承包商”会有更多的问题。不仅如此。@maaartinus我不认为“毫无收获”是正确的。如果需要整数语义模2^N,则需要无符号类型。如果您需要一个更大的值范围,该值在不使对象变大的情况下永远不会为负值,那么您需要一个无符号类型。如果不需要符号扩展,则需要无符号类型。C有混合有符号和无符号整数的规则,它们确实是正常的。当隐式转换是您想要的时,不需要强制转换。
public static int toInt16(byte high, byte low) {
    int res = (high << 8);
    res |= (low & 0xFF);
    return res & 0xFFFF;
}