2016-03-24 2 views
0

Я просто пытаюсь добавить числа от 1 до Integer.MAX_VALUE, но на выходе ничего не получаю. Программа пробивается между ними. Ниже приведен класс, который я создал.Почему Integer.MAX_VALUE + 1 меньше Integer.MAX_VALUE?

public class Test { 
    public static void main(String args[]) { 
     long sum = 0; 
     int start_value = 1; 
     long end_value = Integer.MAX_VALUE; 
     while(start_value <= end_value){ 
      sum += start_value; 
      start_value++; 
     } 
     System.out.println(sum); 
    } 
} 

Есть ли у кого-нибудь идеи, почему это висит. Эта программа никогда не завершается.

Как решить эту проблему?

+2

Вы можете это исправить, заменив 'INT START_VALUE = 1;' 'к длинным START_VALUE = 1;'. –

+0

Спасибо, что получил ответ. – user2601809

ответ

2

Это из-за чего-то, называемого целым переполнением. Когда вы добавляете 1 в MAX_VALUE, вы получаете MIN_VALUE, если вы используете целые числа со знаком или 0, если используете целые числа без знака.

Кратко объяснил, когда вы добавляете 1 к 99, например, вы должны нести 1 дважды в конечном итоге на третьей цифры: 100. Но если вы допустили максимум 2 цифры, то вы переносите один раз и заканчиваете 00. В компьютерах, существует ограниченное число битов (двоичных цифр) допускается, как правило, 32 или 64.

Вы можете прочитать больше об этом здесь:
Wiki Integer Overflow
Signed vs Unsigned Integers

+0

Спасибо ... Получил ответ – user2601809

3

Он должен никогда не бывает полной, как у вас есть бесконечный цикл.

Ваш цикл эффективно

while(start_value <= Integer.MAX_VALUE) { 

но Integer.MAX_VALUE является самым большим по определению, так что эффективная

while (true) { 

Вы можете изменить цикл, чтобы делать то, что вам нужно

int start_value = 0; 
while(start_value < end_value) { 
    start_value++; 
    sum += startValue; 
} 

Таким образом, вы можете поймать проблему, прежде чем она потерпит неудачу.

тупое решение может быть

for (int i = 1; i > 0; i++) 
    sum += i; 

Это остановит когда i переполняется.

0

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

public class Test { 
public static void main(String args[]) { 
    long sum = 0; 
    int start_value = 1; 
    int end_value = Integer.MAX_VALUE - 1;//Just in case 
    while(start_value <= end_value){ 
     sum += start_value; 
     start_value++; 

     //Print every 100 loops, change this if it prints too often 
     if (start_value % 100 == 0){ 
      System.out.println("integer at: " + start_value + ", sum: " + sum); 
     } 
    } 
    System.out.println(sum + Integer.MAX_VALUE);//Since we only went to Integer.MAX_VALUE -1 

    } 
} 
0

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

Java 8 позволяет новое решение, так как могут использоваться IntStream.rangeClosed и LongStream.rangeClosed.

В вашем случае, вы можете сделать

IntStream.rangeClosed(1, Integer.MAX_VALUE).mapToLong(i -> i).sum(); 

или просто

LongStream.rangeClosed(1, Integer.MAX_VALUE).sum(); 
Смежные вопросы