为什么仅通过移位转换两个字节是不正确的?

Why is converting two bytes just with shifting is incocrrent?

我阅读了 this 关于移动的主题。我以为如果我有两个字节:

byte hi = //...
byte low = //...

为什么我不能那样做

short s = (short)((hi << 8) | low)

为什么不正确?我认为我们左移 8 位最高有效位并保留最低有效字节。然后只是按位或他们。

这给出了错误的结果,因为字节被签名并扩展为 int 以进行计算。举个例子

hi = (byte)0x01;
low = (byte)0x80;

然后你计算:

0x00000100 | 0xffffff80 -> 0xffffff80

这不是想要的结果。

你可以这样写:

short s = (short)((hi << 8) | (low & 0xff))