时间:
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;
}
我的问题是;为什么第一个陈述是肯定的,而第二个陈述是否定的?
最佳答案
在这一行
total += (b[i] & 255) << shift;
括号内的表达式是 int
类型,左移将其最左边的位设置为 1,使其成为负数。只有在所有计算完成后才会转换为 long
。
long tmp = (b[i] & 255);
这里的表达式是long
,最左边的位在移位后将保持为零。
如果您想保留第一个表达式,只需为括号中的表达式添加一个转换为 long
或使用一个 long
常量 255L
。
关于java - 为什么在Java中使用以下两个移位运算符语句会返回两个不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12167147/