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

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

我的问题是;为什么第一个陈述是肯定的,而第二个陈述是否定的?

最佳答案

在这一行

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/

相关文章:

java - 使用 DateUtils 类的 parseDateStrictly() 方法时出现异常无法解析日期

java - Tomcat 无法在 Mac 上运行

javascript - 添加两个带移位的十六进制数字javascript

java - 如何使用 32 位 Visual Studio 生成器使 CMake 的 FindJava 获得 64 位 Java

java - jLabel.setOpaque(true) 不起作用

c - 有符号整数的算术右移

java - Java >> 和 >>> 右移运算符之间有任何性能差异吗?

javascript - Array.prototype.forEach() - 为什么该方法的代码拥有按位移位运算符?

eclipse - 停止 eclipse 添加 @Overide 注释

c - 为什么位移运算符使我的哈希函数如此快?