Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中int的范围_Java_Integer_Range - Fatal编程技术网

Java中int的范围

Java中int的范围,java,integer,range,Java,Integer,Range,我知道Java中的int范围应该是-2^31到2^31-1 但当我用20运行此代码段时: public class Factorial { public int factorial(int n) { int fac=1; for (int i=1; i<=n; i++) { fac *= i; System.out.println("Factorial of " + i + &quo

我知道Java中的int范围应该是-2^31到2^31-1

但当我用20运行此代码段时:

public class Factorial {
    public int factorial(int n) {
        int fac=1;
        for (int i=1; i<=n; i++) {
            fac *= i;
            System.out.println("Factorial of " + i + " is: " + fac);
        }
        return fac;
    }
}
从13(13!=6227020800)来看没有意义。它看起来超出了范围,被包裹起来了。发生了什么?是因为我用了这个吗

虽然我认为这不相关,但以下是测试代码:

public class TestFac {

    public static void main(String[] args) {
        int n;
        Scanner sc = new Scanner(System.in);

        System.out.println("Input num you want to factorial: ");
        n = sc.nextInt();
        Factorial fac = new Factorial();
        fac.factorial(n);
    }
}
发件人:

int
数据类型是一个32位有符号2的补码整数。它的最小值为-2147483648,最大值为2147483647(含)。对于整数值,此数据类型通常是默认选择,除非有理由(如上所述)选择其他数据类型。此数据类型很可能足够大,足以容纳程序将使用的数字,但如果需要更大范围的值,请使用long


这个故事的寓意是:永远不要盲目地相信你的老师

如果选中Java Integer,其最大值和最小值如下所示:

int    MAX_VALUE = 2147483647
int    MIN_VALUE = -2147483648

如果你做一些数学运算,你会发现(13的阶乘)
1932053504*14
27048749056
,它超过了int,这就是为什么你得到14的阶乘的错误结果。因此,为了获得好的结果,最好使用
long
类型。

阶乘13是6227020800。这是超过31位的长度,所以它是环绕的


如果要支持大数(例如任意长度),则考虑使用提供无限范围的类。

这里,我想提一下整数时钟的概念。

Java中int的最大值和最小值为:

int MAX_VALUE = 2147483647
int MIN_VALUE = -2147483648
请检查以下结果

 int a = 2147483645;
 for(int i=0; i<10; i++) {
    System.out.println("a:" + a++);
 }
它表明,当您超出整数+ve范围的限制时,下一个值将再次从其负起始值开始

 -2147483648,       <-----------------
 -2147483647,                        |
 -2147483646,                        |
  .                                  |
  .                                  |
  .                                  |    (the next value will go back in -ve range)
  0,                                 |
 +1,                                 |
 +2,                                 |
 +3,                                 |
  .                                  |
  .                                  |
  .,                                 |
 +2147483645,                        |
 +2147483646,                        |
 +2147483647     ---------------------
所以,在你的答案中,13的阶乘变成了1932053504。这就是整数时钟的工作原理

您可以使用长数据类型而不是整数来实现您的目的。

请运行以下代码:

System.out.println("Minimum value of Integer is: " + Integer.MIN_VALUE);
System.out.println("Maximum value of Integer is: " + Integer.MAX_VALUE);

因此,您可以看到它失败的原因。

使用长数据类型而不是int。您应该首先检查阶乘13的实际值,看看它是否在0和2^31-1之间。不能将错误归咎于Eclipse或Java。就像贴出的答案一样,选择更长甚至更好的BigInteger。好吧,哪个更大。BigInteger故事的实际寓意:仔细听老师讲课。他说的可能是对的。老师给你的哪些信息是错误的?从你发布的内容来看,只有你的解释似乎是错误的。你是对的。我误解了10次方和2次方。。。的确是愚蠢的错误。长数据类型(值大于长最大值)也会出现同样的问题。。。要限制此错误,请使用BigInteger类,而不是“整数时钟”和“整数的+ve范围”是什么意思?
 -2147483648,       <-----------------
 -2147483647,                        |
 -2147483646,                        |
  .                                  |
  .                                  |
  .                                  |    (the next value will go back in -ve range)
  0,                                 |
 +1,                                 |
 +2,                                 |
 +3,                                 |
  .                                  |
  .                                  |
  .,                                 |
 +2147483645,                        |
 +2147483646,                        |
 +2147483647     ---------------------
        6227020800
      - 2147483647 (+ve max value)
   -----------------
Value = 4079537153
      - 2147483648 (-ve max value)
   -----------------
value = 1932053505
   -             1  (for zero in between -ve to +ve value)
  ----------------
Answer = 1932053504
System.out.println("Minimum value of Integer is: " + Integer.MIN_VALUE);
System.out.println("Maximum value of Integer is: " + Integer.MAX_VALUE);