Java,将两个整数合并为长结果负数
Java, combining two integers to long results negative number
我正在尝试将两个整数组合成 Java 中的一个长整型。这是我正在使用的代码:
Long combinedValue = (long) a << 32 | b;
当a = 0x03
和b = 0x1B56 ED23
时,我能够得到期望值(combinedValue = 13343583523
in long)。
但是,当我的 a = 0x00
和 b = 0xA2BF E1C7
时,我得到一个负值 -1567628857
,而不是 2730484167
。谁能解释为什么将整数 0 移动 32 位会导致前 32 位变为 0xFFFF FFFF
?
谢谢
b
也是负数。这就是常量的意思。您可能想要的是((long) a << 32) | (b & 0xFFFFFFFFL)
。
当您使用 b
或 (long) a << 32
时,如果 b
是一个 int
,那么它将被提升为一个 long
,因为该操作必须是在相同类型的两个值之间完成。这称为扩大转换。
当从 int
到 long
的转换发生时,b
将被符号扩展,这意味着如果设置了最高位,那么它将被复制到最高 32 位的 64 位长值。这就是导致前 32 位成为 0xffffffff
.
的原因
我正在尝试将两个整数组合成 Java 中的一个长整型。这是我正在使用的代码:
Long combinedValue = (long) a << 32 | b;
当a = 0x03
和b = 0x1B56 ED23
时,我能够得到期望值(combinedValue = 13343583523
in long)。
但是,当我的 a = 0x00
和 b = 0xA2BF E1C7
时,我得到一个负值 -1567628857
,而不是 2730484167
。谁能解释为什么将整数 0 移动 32 位会导致前 32 位变为 0xFFFF FFFF
?
谢谢
b
也是负数。这就是常量的意思。您可能想要的是((long) a << 32) | (b & 0xFFFFFFFFL)
。
当您使用 b
或 (long) a << 32
时,如果 b
是一个 int
,那么它将被提升为一个 long
,因为该操作必须是在相同类型的两个值之间完成。这称为扩大转换。
当从 int
到 long
的转换发生时,b
将被符号扩展,这意味着如果设置了最高位,那么它将被复制到最高 32 位的 64 位长值。这就是导致前 32 位成为 0xffffffff
.