为什么仅通过移位转换两个字节是不正确的?
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))
我阅读了 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))