Java,将两个整数组合成长结果负数

时间:2016-05-24 23:40:03

标签: java long-integer bits

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

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

a = 0x03b = 0x1B56 ED23时,我能够获得预期值(combinedValue = 13343583523长)。

但是,当我的a = 0x00b = 0xA2BF E1C7时,我得到一个负值-1567628857,而不是2730484167。任何人都可以解释为什么将整数0乘32位导致前32位成为0xFFFF FFFF

由于

2 个答案:

答案 0 :(得分:3)

b也是否定的。这就是常数意味着什么。您可能想要的((long) a << 32) | (b & 0xFFFFFFFFL)

答案 1 :(得分:3)

当您(long) a << 32b时,如果bint,那么它将被提升为long,因为必须在两者之间进行操作两个相同类型的值。这称为扩展转换。

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

相关问题