Java 移位字节返回意外结果

标签 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。

最佳答案

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

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

要解决它,请在执行操作之前用 0xFF 显式屏蔽:

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

关于Java 移位字节返回意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36866581/

相关文章:

c# - 字节列表或字节数组列表的排序列表

c# - 将 JSON 发布到 ASP.NET MVC Nullable Short 属性

Java小端顺序

java - 如何获取使用 ProcessBuilder 执行的进程的内存使用情况和 CPU 时间?

java - 静态代码分析注释

java - 如何将exe文件转换为.jar文件?

delphi - WideChar 转换为字节?

c# - `short` 类型的简写?

c - 请帮助我在 C 中使用 memcpy()

java - 在集合中排序