循环到几次运行后重复将输入转向输出为零,我做错了什么?

时间:2016-10-19 23:10:58

标签: java loops

我写了这个循环,继续对一个数字进行平方,直到它超过1000000.

while(n<1000000){
  n=n*n;
  System.out.println(n);
  count++;
}

然而,当我输入2时,它将正确地执行前4个方格,然后无限输出零。我不知道为什么我是编程的新手并希望得到一些帮助。

2 个答案:

答案 0 :(得分:1)

int的最大值是2147483647. 65536 * 65536的结果将溢出为0.之后,您只会永远地乘以0 * 0。

查看Java spec以了解有关基本类型的可能值的更多信息:

<强> 4.2.1。积分类型和值

  

整数类型的值是以下范围内的整数:

     
      
  • 对于字节,从-128到127,包括
  •   
  • 简而言之,从-32768到32767,包括
  •   
  • 对于int,从-2147483648到2147483647,包括
  •   
  • 长期,从-9223372036854775808到9223372036854775807,包括在内
  •   
  • 对于char,从'\ u0000'到'\ uffff'(含),即从0到65535
  •   

编辑:正如安德烈亚斯在评论中所描述的那样,如果你长时间使用它会起作用。

答案 1 :(得分:0)

这是由于整数溢出造成的。

因为你正在做n = n * n,所以它是前一个数字的平方。 例如,如果n = 2开始, 循环1:    n = 2 * 2 = 4; 循环2:    n = 4 * 4 = 8; 循环3:    n = 8 * 8 = 64; ... 循环k:    n = 2 ^ k * 2 ^ k = 2 ^ 2k

它将在几次迭代后溢出整数的存储容量2147483647。

经过4次迭代后,您将进行计算 2 ^ 32这是4294967296。 这会导致n被赋值为0,因为在java中,整数溢出是通过赋值为0来处理的。 在此之后它仍为0并且无限期地继续,因为它从未满足终止条件。