Java для л oop отрицательно - PullRequest
       93

Java для л oop отрицательно

0 голосов
/ 24 февраля 2020

При запуске ниже кода

  1. Значение count становится равным -1, и программа завершается с исключением деления на ноль.

  2. Когда вы раскомментируете sysout, он работает нормально. Не уверен, как sysout делает различие.

public class HelloWorld{
    public static void main(String []args){

         int num = 1;
         int count;
         int sum;
         int fact;
         for(count=1,sum=0,fact=1;fact<=num;count=count+1){

            //System.out.println("num:"+num+" fact:"+fact+" count:"+count+" sum:"+sum);

             if(num%count==0){

                fact = num/count;
                sum  = sum+fact;
                System.out.println("num:"+num+" fact:"+fact+" count:"+count+" sum:"+sum);
             }

         }
    }
}

Вывод:

число: 1 факт: 1 счет: 1 сумма: 1

число: 1 факт: -1 количество: -1 сумма: 0

Исключение в потоке "main" java .lang.ArithmeticException: / by zero в HelloWorld.main (HelloWorld. java: 14)

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Вы продолжаете увеличивать счетчик, и он в конечном итоге переполняется и оборачивается до 0.

In binary, Integer.MAX_VALUE = 2147483647 = 01111111 11111111 11111111 11111111                                              
                                            ^
                                            sign bit (positive)

When you add one more to the number it becomes

          Integer.MIN_VALUE = -2147483648 = 1000000 000000 000000 000000 000000
                                            ^
                                            sign bit (negative)

Таким образом, он оборачивается и переходит от Integer.MAX_VALUE к Integer.MIN_VALUE.

  for(int count=Integer.MAX_VALUE -10; count != Integer.MIN_VALUE + 10; count++){
         System.out.println("count = " + count);
  }

Как вы можете видеть, если вы продолжите добавлять 1 к count, оно в конечном итоге увеличится до 0, и вы получите деление на ошибку 0.

Вы можете прочитать больше о Дополняющее представление двоих в Википедии.

0 голосов
/ 24 февраля 2020

Счет определяется как целое число, когда его значение становится больше, чем Integer. MAX_VALUE его переполняется и становится отрицательным.

Поскольку (1% любое число больше 1) не может быть нулем, поэтому l oop продолжает работать, значение счетчика продолжает расти и переполняется после циклов Integer.MAX_VALUE.

...