数据范围导致的循环问题

嗨呀,随手一写就是个bug

1
2
3
4
5
6
7
8
9
10
11
12
13
int ans=0;
int i=0;
while(true) {
i++;
if(2*ans*ans<(50000*50000))
ans++;
else {
ans--;
break;
}
}
System.out.println(ans*ans*4);
System.out.println(i);

代码如上所示,令人感到十分非常奇怪的是每次只能循环一次,即打印出来的 i 永远为1

后来才发现是因为50000*50000=25亿

而java 的 int 数据类型范围为 -2^31~ 2^31 大约为21亿

所以25亿会溢出,应该是变为负数

解决方法是每一个50000后加一个字母l,表明是 long 数据类型,即 50000l

修改之后更有趣了,不会只循环一次,但是陷入了死循环…

后来才发现2*ans*ans 是不可能超过50000*50000 的,因为ans本身也是int类型

所以最后把ans改为long类型,代码便可以正常运行了

文章目录
|