java - 为什么Java溢出返回0作为值
问题描述
我有以下代码片段
public class DN1{
public static void main(String argv[]){
int a = 869;
int b = 85;
for(int i = 0; i < a; i++){
b += b;
}
System.out.println(b);
}
}
这段代码明显溢出i = 24
我想知道为什么在几个循环之后b
设置为 0。这种溢出行为是什么以及它在 Java 中究竟是如何工作的?
我预计输出会在两者之间变化,-2^31 to +2^31
但事实并非如此,这是为什么呢?
解决方案
更准确地说,输出在您指定的范围内。0 有资格在Integer.MIN_VALUE
和之间Integer.MAX_VALUE
。
稍微修改一下你的代码,你可以看看发生了什么并打印出实际的二进制文件
int a = 869;
int b = 85;
for(int i = 0; i < a; i++){
System.out.printf(
"Iteration %d: b = %d; b+b = %d; bin(b) = %s; bin(b+b) = %s%n",
i, b, (b+b), Integer.toBinaryString(b), Integer.toBinaryString(b+b));
b += b;
}
System.out.println(b);
这给出了以下输出
Iteration 0: b = 85; b+b = 170; bin(b) = 1010101; bin(b+b) = 10101010
Iteration 1: b = 170; b+b = 340; bin(b) = 10101010; bin(b+b) = 101010100
Iteration 2: b = 340; b+b = 680; bin(b) = 101010100; bin(b+b) = 1010101000
Iteration 3: b = 680; b+b = 1360; bin(b) = 1010101000; bin(b+b) = 10101010000
Iteration 4: b = 1360; b+b = 2720; bin(b) = 10101010000; bin(b+b) = 101010100000
Iteration 5: b = 2720; b+b = 5440; bin(b) = 101010100000; bin(b+b) = 1010101000000
Iteration 6: b = 5440; b+b = 10880; bin(b) = 1010101000000; bin(b+b) = 10101010000000
Iteration 7: b = 10880; b+b = 21760; bin(b) = 10101010000000; bin(b+b) = 101010100000000
Iteration 8: b = 21760; b+b = 43520; bin(b) = 101010100000000; bin(b+b) = 1010101000000000
Iteration 9: b = 43520; b+b = 87040; bin(b) = 1010101000000000; bin(b+b) = 10101010000000000
Iteration 10: b = 87040; b+b = 174080; bin(b) = 10101010000000000; bin(b+b) = 101010100000000000
Iteration 11: b = 174080; b+b = 348160; bin(b) = 101010100000000000; bin(b+b) = 1010101000000000000
Iteration 12: b = 348160; b+b = 696320; bin(b) = 1010101000000000000; bin(b+b) = 10101010000000000000
Iteration 13: b = 696320; b+b = 1392640; bin(b) = 10101010000000000000; bin(b+b) = 101010100000000000000
Iteration 14: b = 1392640; b+b = 2785280; bin(b) = 101010100000000000000; bin(b+b) = 1010101000000000000000
Iteration 15: b = 2785280; b+b = 5570560; bin(b) = 1010101000000000000000; bin(b+b) = 10101010000000000000000
Iteration 16: b = 5570560; b+b = 11141120; bin(b) = 10101010000000000000000; bin(b+b) = 101010100000000000000000
Iteration 17: b = 11141120; b+b = 22282240; bin(b) = 101010100000000000000000; bin(b+b) = 1010101000000000000000000
Iteration 18: b = 22282240; b+b = 44564480; bin(b) = 1010101000000000000000000; bin(b+b) = 10101010000000000000000000
Iteration 19: b = 44564480; b+b = 89128960; bin(b) = 10101010000000000000000000; bin(b+b) = 101010100000000000000000000
Iteration 20: b = 89128960; b+b = 178257920; bin(b) = 101010100000000000000000000; bin(b+b) = 1010101000000000000000000000
Iteration 21: b = 178257920; b+b = 356515840; bin(b) = 1010101000000000000000000000; bin(b+b) = 10101010000000000000000000000
Iteration 22: b = 356515840; b+b = 713031680; bin(b) = 10101010000000000000000000000; bin(b+b) = 101010100000000000000000000000
Iteration 23: b = 713031680; b+b = 1426063360; bin(b) = 101010100000000000000000000000; bin(b+b) = 1010101000000000000000000000000
Iteration 24: b = 1426063360; b+b = -1442840576; bin(b) = 1010101000000000000000000000000; bin(b+b) = 10101010000000000000000000000000
Iteration 25: b = -1442840576; b+b = 1409286144; bin(b) = 10101010000000000000000000000000; bin(b+b) = 1010100000000000000000000000000
Iteration 26: b = 1409286144; b+b = -1476395008; bin(b) = 1010100000000000000000000000000; bin(b+b) = 10101000000000000000000000000000
Iteration 27: b = -1476395008; b+b = 1342177280; bin(b) = 10101000000000000000000000000000; bin(b+b) = 1010000000000000000000000000000
Iteration 28: b = 1342177280; b+b = -1610612736; bin(b) = 1010000000000000000000000000000; bin(b+b) = 10100000000000000000000000000000
Iteration 29: b = -1610612736; b+b = 1073741824; bin(b) = 10100000000000000000000000000000; bin(b+b) = 1000000000000000000000000000000
Iteration 30: b = 1073741824; b+b = -2147483648; bin(b) = 1000000000000000000000000000000; bin(b+b) = 10000000000000000000000000000000
Iteration 31: b = -2147483648; b+b = 0; bin(b) = 10000000000000000000000000000000; bin(b+b) = 0
您实际上是在向左移动位,逻辑上相当于在每次迭代时乘以 2。您最终10000000000000000000000000000000
在第 31 次迭代中得到二进制文件,并将其向左移动会将1
序列推出序列外,因此您将得到00000000000000000000000000000000
. 这发生在第 31 次迭代,无论您的 b 起始值如何(您只有 32 位可使用,位置 0-31)。
附录:其他写法b += b
:
b <<= 1
b *= 2
推荐阅读
- amazon-web-services - 使用 NGINX 时如何摆脱重定向
- php - Wordpress PHP错误标签换行和css样式?
- java - 在哪里可以找到并安装 org.osgi.framework 包?
- javascript - 如果代码进入 if 时钟而不是 else 块,则内部错误条件后的事件
- sql - 每秒将列从 excel 发送到 MSSQL 5 次
- excel - 将各种excel中的同名表合并为一张
- tableau-api - 如何在画面中比较当前和去年期间的 3 个度量
- c++ - 以二进制格式写入 vtk 文件
- python - 避免 for 循环创建数组
- javascript - TinyMCE 5:大写的自定义工具栏按钮