java - 为什么仅通过移位转换两个字节是不一致的?

标签 java byte short

我读到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))

关于java - 为什么仅通过移位转换两个字节是不一致的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45656798/

相关文章:

java - 无法在 pom.xml 中为 ojdbc14 添加 Maven 依赖项

java - 我可以用这种方式声明 ArrayList 吗?

java - 使用 MiniZinc 模型从 Java 调用 geocode

java - 为什么没有 String.valueOf(short a);

c - 添加两个短号码时

javascript - jQuery、JavaScript 中变量和函数的 1 个字母名称

java - 在 equals() 方法中分配字段

function - Golang 包结构返回缓冲区

javascript - 在javascript中将 float 转换为字符串

具有 0x00 字符的 C++ 数据数组