Java,将两个整数合并为长结果负数

Java, combining two integers to long results negative number

我正在尝试将两个整数组合成 Java 中的一个长整型。这是我正在使用的代码:

Long combinedValue = (long) a << 32 | b;

a = 0x03b = 0x1B56 ED23时,我能够得到期望值(combinedValue = 13343583523 in long)。

但是,当我的 a = 0x00b = 0xA2BF E1C7 时,我得到一个负值 -1567628857,而不是 2730484167。谁能解释为什么将整数 0 移动 32 位会导致前 32 位变为 0xFFFF FFFF?

谢谢

b 也是负数。这就是常量的意思。您可能想要的是((long) a << 32) | (b & 0xFFFFFFFFL)

当您使用 b(long) a << 32 时,如果 b 是一个 int,那么它将被提升为一个 long,因为该操作必须是在相同类型的两个值之间完成。这称为扩大转换。

当从 intlong 的转换发生时,b 将被符号扩展,这意味着如果设置了最高位,那么它将被复制到最高 32 位的 64 位长值。这就是导致前 32 位成为 0xffffffff.

的原因