Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么int数据类型在JAVA中的行为是这样的?_Java_Types_Core - Fatal编程技术网

为什么int数据类型在JAVA中的行为是这样的?

为什么int数据类型在JAVA中的行为是这样的?,java,types,core,Java,Types,Core,下面是我的代码及其输出,但我不明白为什么它会给出这样的输出?任何人都可以帮助我理解输出 public class MainClass1 { double overloadedMethod(double d) { System.out.println("double " + d); return overloadedMethod(d *= d); } static int overloadedMethod(int i) {

下面是我的代码及其输出,但我不明白为什么它会给出这样的输出?任何人都可以帮助我理解输出

public class MainClass1 {
   double overloadedMethod(double d) {
          System.out.println("double " + d);
          return overloadedMethod(d *= d);
   }

   static int overloadedMethod(int i) {
          System.out.println("int " + i);
          return overloadedMethod(i *= i);
   }

   float overloadedMethod(float f) {
          System.out.println("float " + f);
          return overloadedMethod(f *= f);
   }

   public static void main(String[] args) {
          MainClass1 mc = new MainClass1();
          int jj = 300;
          System.out.println(mc.overloadedMethod(jj));
   }
}

输出:-

int 300
int 90000
int -489934592
int 560005120
int 0
int 0
int 0
int 0
.
.
.

它进入无限循环

这里有一个无限循环:

    static int overloadedMethod(int i) {
      System.out.println("int " + i);
      return overloadedMethod(i *= i);
    }

return语句调用它的方法。

您首先调用的是
重载方法(inti)
传递一个300的参数。这张照片是:

int 300
然后
i*=i
i
i
相乘,并将结果90000存储回
i
。然后用这个参数再次调用相同的方法。这就是所谓的递归。因此,该方法的新调用将打印:

int 90000
下次你再去广场。您可能预期结果为8100000,但
int
不能保存此值。它溢出来了。不幸的是,您在Java中没有得到关于这一点的消息。相反,结果是

int -489934592
接下来的几次乘法也会溢出,但溢出后的结果恰好是0:

int 0
从这一点开始,乘法不再溢出,每次只产生0

而且你永远也无法摆脱递归。它一直持续到调用堆栈溢出为止。这被称为无限递归


您是否期望Java会看到81000000不是
int
,然后调用重载方法,使用
float
double
参数?如你所见,这不会发生。Java决定在编译时调用哪个重载方法。所以它没有考虑参数的值(不管怎样,它已经被截断为-489 934 592,所以它也没有帮助)。由于
i
int
重载方法(i*=i)
总是调用
重载方法(inti)
。永远不要使用任何其他的
重载方法

,因为你正在做一个无限循环调用
重载方法
,它调用自己,调用自己,没有可能突破它的递归会这样做。你试过调试器吗?这是一个很好的机会,如果你还没有学会使用一个。你期望哪种输出?请张贴实际的代码。你的代码产生了不同的输出。更正:无限递归。谢谢你的回答,但我不明白为什么它会给出-489934592560005120,然后降到0。@VihangShah也许下次在问题中会说让你困惑的到底是什么。如您所见,每个人都在关注无限递归,因为他们认为您不期望无限系统输出,而实际上您只想知道为什么打印值不是
8100000000
。这就是为什么每个人都问你期望输出是什么,但不幸的是你没有回答他们谢谢你的回答。它真的很有用。300可以被4整除。所以在第一次调用中,它的最低两位是零。每次调用时,值都是平方的,因此值的二进制表示将其最低位的两倍设置为零(2,4,8,16,32),因此在五次迭代后,所有位都为零。使用一个相对素数为2²的数字不应以零结束,但可能会以另一个稳定点i=i*i mod 2²结束……也称为奇数。谢谢你的解释,@PeteKirkham