首页 > 解决方案 > 为什么我的结果是 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

标签: javaarraysfor-loop

解决方案


让我们一步一步地回顾它(这也是您可以在调试器中执行的操作!!):

  1. int[]myArray = new int[5];: 这将是一个数组{0,0,0,0,0}。一个大小为 5 的数组,默认值为int-value 0

  2. for(int index=0; index<myArray.length; index++):在范围内循环[0, 5)

  3. myArray[3] = 100*myArray[3]*myArray[3]+3;:让我们将其拆分为以下子步骤:

    1. myArray[3] = 100 * 0 * 0 + 3结果是3
    2. myArray[3] = 100 * 3 * 3 + 3结果是903
    3. myArray[3] = 100 * 903 * 903 + 3结果是81540903
    4. myArray[3] = 100 * 81540903 * 81540903 + 3结果是-749594073
    5. myArray[3] = 100 * -749594073 * -749594073 + 3结果是1436189223
  4. 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 位而不是int32 位,因此可以在这里得到正确的结果:

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.


推荐阅读