java - 为什么我的结果是 1436189223 ?请帮我解释这个结果
问题描述
public static void main(String[] args) {
int[]myArray = new int[5];
for(int index =0;index<myArray.length;index++)
myArray[3]=100*myArray[3]*myArray[3]+3;
System.out.println("myArray[]="+myArray[3]);
}
请帮助我为什么 myArray[] 结果是 1436189223
解决方案
让我们一步一步地回顾它(这也是您可以在调试器中执行的操作!!):
int[]myArray = new int[5];
: 这将是一个数组{0,0,0,0,0}
。一个大小为 5 的数组,默认值为int
-value0
。for(int index=0; index<myArray.length; index++)
:在范围内循环[0, 5)
:myArray[3] = 100*myArray[3]*myArray[3]+3;
:让我们将其拆分为以下子步骤:myArray[3] = 100 * 0 * 0 + 3
结果是3
myArray[3] = 100 * 3 * 3 + 3
结果是903
myArray[3] = 100 * 903 * 903 + 3
结果是81540903
myArray[3] = 100 * 81540903 * 81540903 + 3
结果是-749594073
myArray[3] = 100 * -749594073 * -749594073 + 3
结果是1436189223
System.out.println("myArray[]="+myArray[3]);
: 打印 的值myArray[3]
,因此1436189223
。
有些事情要注意。首先,为什么使用myArray[3]
开头.. 这将是一个更简单的选择,因为您根本不使用数组:
int result=0;
for(int i=0; i<5; i++)
result = 100*result*result+3;
System.out.println("Result: "+result);
但是您的问题可能主要涉及的部分是为什么100 * 81540903 * 81540903 + 3
会导致-749594073
. 这是因为最大int
尺寸为 2 32 -1 ( 2,147,483,647
)。之后它将环绕。所以int i = 2147483647 + 1
会导致-21474836481
(或更一般地Integer.MAX_VALUE + 1 == Integer.MIN_VALUE
)。
这同样适用于其他数据类型,如byte
, short
,long
等。在这里您可以看到每种数据类型的一些范围。
由于long
是 64 位而不是int
32 位,因此可以在这里得到正确的结果:
long result=0L;
for(int i=0; i<5; i++)
result = 100*result*result+3;
System.out.println("Result: "+result);
或使用您的原始代码:
long[]myArray = new long[5]; // <- This is a long-array now
for(int index =0;index<myArray.length;index++)
myArray[3]=100*myArray[3]*myArray[3]+3;
System.out.println("myArray[]="+myArray[3]);
PS:如果您必须超出 的大小long
,则必须使用java.math.BigInteger
.