我试图在Java中将两个整数组合成一个长整数。这是我正在使用的代码:
Long combinedValue = (long) a << 32 | b;
当a = 0x03
和b = 0x1B56 ED23
时,我能够获得预期值(combinedValue = 13343583523
长)。
但是,当我的a = 0x00
和b = 0xA2BF E1C7
时,我得到一个负值-1567628857
,而不是2730484167
。任何人都可以解释为什么将整数0乘32位导致前32位成为0xFFFF FFFF
?
由于
答案 0 :(得分:3)
b
也是否定的。这就是常数意味着什么。您可能想要的是((long) a << 32) | (b & 0xFFFFFFFFL)
。
答案 1 :(得分:3)
当您(long) a << 32
与b
时,如果b
是int
,那么它将被提升为long
,因为必须在两者之间进行操作两个相同类型的值。这称为扩展转换。
当从int
转换为long
时,b
将被符号扩展,这意味着如果设置了最高位,那么它将被复制到前32位。 64位长的值。这就是导致前32位为0xffffffff
的原因。