Java 为什么它会返回超过第47个斐波那契数的负数?

Java 为什么它会返回超过第47个斐波那契数的负数?,java,fibonacci,Java,Fibonacci,我编写了一个程序来存储斐波那契数,并将检索第n个斐波那契数。它工作正常,直到第50个斐波那契函数返回一个负数 getFibonacci(47)返回1836311903,但 getFibonacci(48)返回-1323752223。为什么会这样 public class Fibonacci { static HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); public st

我编写了一个程序来存储斐波那契数,并将检索第n个斐波那契数。它工作正常,直到第50个斐波那契函数返回一个负数

getFibonacci(47)返回1836311903,但
getFibonacci(48)返回-1323752223。为什么会这样

public class Fibonacci {
    static HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();

    public static void main(String[] args) {
        int x;
        storeFibonacciNumbers(50);
        System.out.println(getFibonacci(48));
    }

    public static void storeFibonacciNumbers (int n){
        for (int x=1; x <= n; x++ ){
            if(x == 1){
                map.put(x, 0);
            }
            else if (x == 2) {
                map.put(x, x-1);
            }
            else
                map.put(x, map.get(x-1) + map.get(x-2));
        }
    }

    public static long getFibonacci (int x){
        return map.get(x);
    }
}
公共类Fibonacci{
静态HashMap map=newhashmap();
公共静态void main(字符串[]args){
int x;
商店号码(50);
System.out.println(getFibonacci(48));
}
公共静态无效存储Fibonacciumbers(int n){

对于(int x=1;x这是因为
int
类型的值太高了。最大值为2147483647,此时它将重新开始。如果要正确表示更大的数字,需要使用不同的数据类型,例如
long

这是因为已达到
整数的最大值。当如果你试图给它添加一个值,它就会溢出,并“环绕”到负值

另一种选择是使用支持更高最大值的类型(例如
Long


在某些情况下,您可能会被迫切换到更复杂的类型,但这些类型专门用于存储非常大的整数(例如)。

最大java整数为2^31-1或2147483647。达到该值后,您将开始返回负数


您可以使用常量Integer.MAX_值作为在达到该值后停止程序的一种方法。

这被调用,并且当一个数字的增量超过/低于其最大/最小(内存)界限时发生(对于java.lang.Integer,这将是-2^31和2^31-1)

一种情况,当算术运算(如乘法或加法)的结果超过用于存储它的整数类型的最大值时,会发生这种情况。

在HashMap中,您将斐波那契数存储为整数。一个整数可以保存的最大值是
2147483647
(2^31-1) 所以根据你们的计算,斐波那契(47)必须超过最大值,溢出正在发生


将HashMap值类型更改为Long。这将解决您的问题。

很抱歉,我不是英语母语人士…对我来说,溢出是溢出,即使在堆栈上也是如此:-)