当:
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;
}
我的问题是;为什么第一个陈述是正面的,第二个否定的是它们看起来是同一个陈述?
答案 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
对于long
和int
,相同的位的解释方式不同。