为什么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