Java中int的范围
我知道Java中的int范围应该是-2^31到2^31-1 但当我用20运行此代码段时: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
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);