Java 当结果应为正整数时,方法生成不变的结果

Java 当结果应为正整数时,方法生成不变的结果,java,types,Java,Types,情况: 30: 1409286144 31: 738197504 32,33: -2147483648 34: 0 正在尝试测试以下代码,但出现了一些奇怪的情况,我无法理解原因: public static void main(String[] args){ int x = 30; if(product_n(x)>1000000) System.out.println("yes " + product_n(x)); else Sy

情况:

30: 1409286144
31: 738197504
32,33: -2147483648
34: 0
正在尝试测试以下代码,但出现了一些奇怪的情况,我无法理解原因:

public static void main(String[] args){
    int x = 30;
    if(product_n(x)>1000000)
        System.out.println("yes " + product_n(x));

    else
        System.out.println("nope "+ product_n(x));
}
// the following method returns the product of the n first integers(excluding 0)
public static int product_n(int n)
{
    int product = 1;
    if (n<=0)
        return 0;
    for(int i = n; i>(n-n);i--)
        product *=i;
    return product;
}

因此,从逻辑上讲,当I递增x时,该方法应该返回一个大于前一个的整数。我猜这与变量可以容纳的最大字节数有关。那么,如何解释31,32,33,34的行为呢。如果要解决此问题,是否应将类型从int更改为long?

尝试使用double。

int变量占用4个字节,可以存储以下范围内的数字:

-2,147,483,648 to 2,147,483,647
±1.79769313486231570E+308
这不足以存储30的阶乘

2.652528598E+32
双变量占用8个字节,可存储以下范围内的数字:

-2,147,483,648 to 2,147,483,647
±1.79769313486231570E+308
代码:

在某些情况下,您会将输出视为负数,因为:

存储结果所需的位数小于 电话号码。在这种情况下,会发生溢出。当溢出 发生这种情况时,它只存储一部分位。假设您需要40位 存储答案,但您只存储了其中的32个。这是32位 在某些情况下是负数


尝试使用double。

int变量占用4个字节,可以存储以下范围内的数字:

-2,147,483,648 to 2,147,483,647
±1.79769313486231570E+308
这不足以存储30的阶乘

2.652528598E+32
双变量占用8个字节,可存储以下范围内的数字:

-2,147,483,648 to 2,147,483,647
±1.79769313486231570E+308
代码:

在某些情况下,您会将输出视为负数,因为:

存储结果所需的位数小于 电话号码。在这种情况下,会发生溢出。当溢出 发生这种情况时,它只存储一部分位。假设您需要40位 存储答案,但您只存储了其中的32个。这是32位 在某些情况下是负数


你能解释一下为什么它从正数到负数再到0吗?@RogerSteinberg它被称为整数溢出当溢出发生时,它只存储一部分位。假设您需要40位来存储答案,但您只存储了其中的32位。这32位原来是一个很大的负数。因此,在int的情况下,它打印No而不是Yes。你能解释一下为什么它从正数变为负数,然后是0吗?@RogerSteinberg它被称为整数溢出当发生溢出时,它只存储一部分位。假设您需要40位来存储答案,但您只存储了其中的32位。这32位原来是一个很大的负数。因此,在int的情况下,它打印No而不是Yes。