为什么在Java中使用以下两个移位运算符语句时会返回两个不同的结果

时间:2012-08-28 20:34:29

标签: java bit-shift

当:

byte[] b = {-128, 0, 0, 0};
long total = 0;

第一个表达式返回-2,147,483,648:

for (int i = 0; i < b.length; i++) {
   int shift = (b.length - 1 - i) * 8;
   total += (b[i] & 255) << shift;
}

第二个返回2,147,483,648:

for (int i = 0; i < b.length; i++) {
   int shift = (b.length - 1 - i) * 8;
   long tmp = (b[i] & 255);
   total += tmp << shift;
}

我的问题是;为什么第一个陈述是正面的,第二个否定的是它们看起来是同一个陈述?

3 个答案:

答案 0 :(得分:3)

在这一行

total += (b[i] & 255) << shift;

带括号的表达式为int类型,左移位将其最左边的位设置为1,使其成为负数。只有在完成所有计算后才会转换为long

long tmp = (b[i] & 255);

此处表达式为long,最左边的位在移位后将保持为零。

如果您想保留第一个表达式,只需为括号内的表达式添加一个强制转换为long,或使用long常量255L

答案 1 :(得分:1)

将int移入符号位会导致负数 将长数移动相同的数量会产生正数

答案 2 :(得分:1)

如果您运行以下代码,您可能会了解正在发生的事情:

System.out.println(Integer.toBinaryString(-2147483648));
System.out.println(Long.toBinaryString(2147483648L));

打印

10000000000000000000000000000000
10000000000000000000000000000000

对于longint,相同的位的解释方式不同。