1

什么时候:

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;
}

我的问题是;为什么第一个陈述是肯定的,而第二个陈述看起来是相同的陈述?

4

3 回答 3

3

在这一行

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

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

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

这里的表达式是long,移位后最左边的位将保持为零。

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

于 2012-08-28T20:43:24.377 回答
1

将 int 移入符号位会导致负数 将 long 移位相同的量会导致正数

于 2012-08-28T20:44:08.853 回答
1

如果您运行以下代码,您可能会了解发生了什么:

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

它打印

10000000000000000000000000000000
10000000000000000000000000000000

long对于和,相同的位有不同的解释int

于 2012-08-28T20:45:42.930 回答