Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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认为从10到99的所有数字的乘积都是0?_Java - Fatal编程技术网

为什么Java认为从10到99的所有数字的乘积都是0?

为什么Java认为从10到99的所有数字的乘积都是0?,java,Java,以下代码块的输出为0 public class HelloWorld{ public static void main(String []args){ int product = 1; for (int i = 10; i <= 99; i++) { product *= i; } System.out.println(product); } } 公共类HelloWorld{ 公共静

以下代码块的输出为0

public class HelloWorld{

    public static void main(String []args){
        int product = 1;
        for (int i = 10; i <= 99; i++) {
            product *= i;
        }
        System.out.println(product);
    }
}
公共类HelloWorld{
公共静态void main(字符串[]args){
int乘积=1;
对于(inti=10;i它看起来像一个

看看这个

BigDecimal product=new BigDecimal(1);
for(int i=10;i<99;i++){
    product=product.multiply(new BigDecimal(i));
}
System.out.println(product);
输出不再是
int
值。由于溢出,您将得到错误的值

如果溢出,则返回到最小值并从 如果它下溢,它会回到最大值,然后 从那里继续

更多

编辑

让我们按如下方式更改代码

int product = 1;
for (int i = 10; i < 99; i++) {
   product *= i;
   System.out.println(product);
}

在中间的某个地方,你可以得到<代码> 0 >代码>作为产品。因此,你的整个产品将是0。 就你而言:

for (int i = 10; i < 99; i++) {
    if (product < Integer.MAX_VALUE)
        System.out.println(product);
    product *= i;
}
// System.out.println(product);

System.out.println(-2147483648 * EvenValueOfi); // --> this is the culprit (Credits : Kocko's answer )

O/P :
1
10
110
1320
17160
240240
3603600
57657600
980179200
463356416
213837312
-18221056
-382642176
171806720
-343412736
348028928
110788608
-1414463488
464191488
112459776
-1033633792
-944242688
793247744
-385875968
150994944
838860800
-704643072
402653184
2013265920
-805306368
-1342177280  --> Multiplying this and the current value of `i` will also give -2147483648 (INT overflow)
-2147483648  --> Multiplying this and the current value of `i` will also give -2147483648 (INT overflow)

-2147483648  ->  Multiplying this and the current value of 'i' will give 0 (INT overflow)
0
0
0
for(int i=10;i<99;i++){
if(乘积<整数最大值)
系统输出打印项次(产品);
产品*=i;
}
//系统输出打印项次(产品);
System.out.println(-2147483648*EvenValueOfi);//-->这就是罪魁祸首(信用:Kocko的答案)
O/P:
1.
10
110
1320
17160
240240
3603600
57657600
980179200
463356416
213837312
-18221056
-382642176
171806720
-343412736
348028928
110788608
-1414463488
464191488
112459776
-1033633792
-944242688
793247744
-385875968
150994944
838860800
-704643072
402653184
2013265920
-805306368
-1342177280-->将此值与“i”的当前值相乘也将得到-2147483648(整数溢出)
-2147483648-->将此值与“i”的当前值相乘也将得到-2147483648(整数溢出)
-2147483648->将此值与当前值“i”相乘将得到0(整数溢出)
0
0
0

每次你将
i
的当前值乘以你得到的
0
作为输出。

如果我运行这个代码,我得到的是全部-

          1 * 10 =          10
         10 * 11 =         110
        110 * 12 =        1320
       1320 * 13 =       17160
      17160 * 14 =      240240
     240240 * 15 =     3603600
    3603600 * 16 =    57657600
   57657600 * 17 =   980179200
  980179200 * 18 =   463356416 <- Integer Overflow (17643225600)
  463356416 * 19 =   213837312
  213837312 * 20 =   -18221056
  -18221056 * 21 =  -382642176
 -382642176 * 22 =   171806720
  171806720 * 23 =  -343412736
 -343412736 * 24 =   348028928
  348028928 * 25 =   110788608
  110788608 * 26 = -1414463488
-1414463488 * 27 =   464191488
  464191488 * 28 =   112459776
  112459776 * 29 = -1033633792
-1033633792 * 30 =  -944242688
 -944242688 * 31 =   793247744
  793247744 * 32 =  -385875968
 -385875968 * 33 =   150994944
  150994944 * 34 =   838860800
  838860800 * 35 =  -704643072
 -704643072 * 36 =   402653184
  402653184 * 37 =  2013265920
 2013265920 * 38 =  -805306368
 -805306368 * 39 = -1342177280
-1342177280 * 40 = -2147483648
-2147483648 * 41 = -2147483648
-2147483648 * 42 =           0 <- produce 0 
          0 * 43 =           0
1*10=10
10 * 11 =         110
110 * 12 =        1320
1320 * 13 =       17160
17160 * 14 =      240240
240240 * 15 =     3603600
3603600 * 16 =    57657600
57657600 * 17 =   980179200

980179200*18=463356416以下是程序在每个步骤中的操作:

1*10=10
10 * 11 =         110
110 * 12 =        1320
1320 * 13 =       17160
17160 * 14 =      240240
240240 * 15 =     3603600
3603600 * 16 =    57657600
57657600 * 17 =   980179200
980179200 * 18 =   463356416
463356416 * 19 =   213837312
213837312 * 20 =   -18221056
-18221056 * 21 =  -382642176
-382642176 * 22 =   171806720
171806720 * 23 =  -343412736
-343412736 * 24 =   348028928
348028928 * 25 =   110788608
110788608 * 26 = -1414463488
-1414463488 * 27 =   464191488
464191488 * 28 =   112459776
112459776 * 29 = -1033633792
-1033633792 * 30 =  -944242688
-944242688 * 31 =   793247744
793247744 * 32 =  -385875968
-385875968 * 33 =   150994944
150994944 * 34 =   838860800
838860800 * 35 =  -704643072
-704643072 * 36 =   402653184
402653184 * 37 =  2013265920
2013265920 * 38 =  -805306368
-805306368 * 39 = -1342177280
-1342177280 * 40 = -2147483648
-2147483648 * 41 = -2147483648
-2147483648 * 42 =           0
0 * 43 =           0
0 * 44 =           0
VVVVVVVVVVVV
VVVVVVVVVVVV
0 * 97 =           0
0 * 98 =           0
请注意,在某些步骤中,乘法的结果是较小的数字(980179200*18=463356416)或不正确的符号(213837312*20=-18221056),这表明存在整数溢出。但零从何而来?请继续阅读

请记住,
int
data type,integer,以下是对每个步骤的说明:

运算结果(1)二进制表示(2)结果(3)
----------------  ------------  -----------------------------------------------------------------  ------------
1 * 10            10                                                               1010            10
10 * 11           110                                                            1101110           110
110 * 12          1320                                                        10100101000          1320
1320 * 13         17160                                                    100001100001000         17160
17160 * 14        240240                                                 111010101001110000        240240
240240 * 15       3603600                                             1101101111110010010000       3603600
3603600 * 16      57657600                                         11011011111100100100000000      57657600
57657600 * 17     980179200                                     111010011011000101100100000000     980179200
980179200 * 18   17643225600                               100 00011011100111100100001000000000     463356416
463356416 * 19    8803771904                                10 00001100101111101110011000000000     213837312
213837312 * 20    4276746240                                   11111110111010011111100000000000     -18221056
-18221056 * 21    -382642176  11111111111111111111111111111111 11101001001100010101100000000000    -382642176
-382642176 * 22   -8418127872  11111111111111111111111111111110 00001010001111011001000000000000     171806720
171806720 * 23    3951554560                                   11101011100001111111000000000000    -343412736
-343412736 * 24   -8241905664  11111111111111111111111111111110 00010100101111101000000000000000     348028928
348028928 * 25    8700723200                                10 00000110100110101000000000000000     110788608
110788608 * 26    2880503808                                   10101011101100010000000000000000   -1414463488
-1414463488 * 27  -38190514176  11111111111111111111111111110111 00011011101010110000000000000000     464191488
464191488 * 28   129973
for (int i = 10; i < 99; i++) {
    if (product < Integer.MAX_VALUE)
        System.out.println(product);
    product *= i;
}
// System.out.println(product);

System.out.println(-2147483648 * EvenValueOfi); // --> this is the culprit (Credits : Kocko's answer )

O/P :
1
10
110
1320
17160
240240
3603600
57657600
980179200
463356416
213837312
-18221056
-382642176
171806720
-343412736
348028928
110788608
-1414463488
464191488
112459776
-1033633792
-944242688
793247744
-385875968
150994944
838860800
-704643072
402653184
2013265920
-805306368
-1342177280  --> Multiplying this and the current value of `i` will also give -2147483648 (INT overflow)
-2147483648  --> Multiplying this and the current value of `i` will also give -2147483648 (INT overflow)

-2147483648  ->  Multiplying this and the current value of 'i' will give 0 (INT overflow)
0
0
0
          1 * 10 =          10
         10 * 11 =         110
        110 * 12 =        1320
       1320 * 13 =       17160
      17160 * 14 =      240240
     240240 * 15 =     3603600
    3603600 * 16 =    57657600
   57657600 * 17 =   980179200
  980179200 * 18 =   463356416 <- Integer Overflow (17643225600)
  463356416 * 19 =   213837312
  213837312 * 20 =   -18221056
  -18221056 * 21 =  -382642176
 -382642176 * 22 =   171806720
  171806720 * 23 =  -343412736
 -343412736 * 24 =   348028928
  348028928 * 25 =   110788608
  110788608 * 26 = -1414463488
-1414463488 * 27 =   464191488
  464191488 * 28 =   112459776
  112459776 * 29 = -1033633792
-1033633792 * 30 =  -944242688
 -944242688 * 31 =   793247744
  793247744 * 32 =  -385875968
 -385875968 * 33 =   150994944
  150994944 * 34 =   838860800
  838860800 * 35 =  -704643072
 -704643072 * 36 =   402653184
  402653184 * 37 =  2013265920
 2013265920 * 38 =  -805306368
 -805306368 * 39 = -1342177280
-1342177280 * 40 = -2147483648
-2147483648 * 41 = -2147483648
-2147483648 * 42 =           0 <- produce 0 
          0 * 43 =           0
980179200 * 18 =   463356416 (should be 17643225600)

17643225600 : 10000011011100111100100001000000000 <-Actual
MAX_Integer :     1111111111111111111111111111111
463356416   :     0011011100111100100001000000000 <- 32 bit Integer
-2147483648 * 42 =           0 (should be -90194313216)

-90194313216: 1010100000000000000000000000000000000 <- Actual
MAX_Integer :       1111111111111111111111111111111
0           :      00000000000000000000000000000000 <- 32 bit Integer
import java.math.BigInteger;

class Ideone {
    public static void main (String[] args) throws java.lang.Exception {
        System.out.println("Result: " + (-2147483648 * 42));
    }
}
import java.math.BigInteger;

class Ideone {
    public static void main (String[] args) throws java.lang.Exception {
        BigInteger p = BigInteger.valueOf(1);
        BigInteger start = BigInteger.valueOf(10);
        BigInteger end = BigInteger.valueOf(99);
        for(BigInteger i = start; i.compareTo(end) < 0; i = i.add(BigInteger.ONE)){
            p = p.multiply(i);
            System.out.println("p: " + p);
        }
        System.out.println("\nProduct: " + p);
    }
}
num   max2  total
10    2     1
12    4     3
14    2     4
16    16    8
18    2     9
20    4    11
22    2    12
24    8    15
26    2    16
28    4    18
30    2    19
32    32   24
34    2    25
36    4    27
38    2    28
40    8    31
42    2    32
BigInteger product = BigInteger.ONE;
for (long i = 10; i < 99; i++) 
    product = product.multiply(BigInteger.valueOf(i));
System.out.println(product.toString());