Java移位字节返回意外结果

时间:2016-04-26 13:35:32

标签: java byte short byte-shifting

我正在尝试将2个字节转换为短字节。这2个字节表示无符号短路,而后者又代表端口。我已经尝试了多种方法将这些字节转换为简短的java。但是,我经常无法正确地做到这一点。

这些是我尝试的方式:

byte a = 0x17;
byte b = 0xCC;

(short)((a << 8) | b);
(short)(((short)a << 8) | b);

结果是0xFFCC,但应该是0x17CC。

2 个答案:

答案 0 :(得分:5)

在Java中经历算术运算的任何值,首先被转换为可以覆盖两个操作数的更高类型。如果它们仍然较小,则两个操作数都被强制转换为int

因此,b首先投放到int并变为0xFFFFFFCC。对于向左移动8位的任何内容进行排序,始终保持掩码0xFFFFFF00,因此对结果没有影响。将它转换为short只会缩小左边的16位。

要解决此问题,请在执行操作前使用0xFF显式屏蔽:

(short)(((a&0xFF)<<8)|(b&0xFF))

答案 1 :(得分:0)

//试试这个,因为你不能从int转换为byte:

short a = 0x17; short b = 0xCC; System.out.println("r = " + String.format("0x%04X", (short)((a << 8) | b)));

//输出:r = 0x17CC