Почему при перемножении положительных чисел, получается отрицательное?

При создании, классу Person передается возраст в годах (от 1 до 100). Метод getMilliseconds пересчитывает возраст в миллисекундах.

При проверке (сколько миллисекунд в 1 годе) выходит ошибка:

Incorrect
expected 31 536 000 000
actual: -1 141 367 296 000

Как исправить тип литералов так, чтобы расчет шел верно?

public class Person {
    private final int years;

    public Person(int years) { this.years = years; }

    public long getMilliSeconds() { return years * 365 * 24 * 60 * 60 * 1000L; }

}

Ответы (1 шт):

Автор решения: Сабир Исламов

Попробуй в самом начале приводить тип к long вот так:

    public long getSeconds() { return (long) years * 365 * 24 * 60 * 60L; }

    public long getMilliSeconds() { return (long) years * 365 * 24 * 60 * 60 * 1000; }

p.s.: Ответил на текст вопроса, а заголовок вопроса пропустил случайно.

Так вот при перемножении или сложении положительных чисел в информатике иногда можно получить отрицательный результат. Всё дело в том, что когда мы делаем эти операции "на листочке в столбик", то мы работаем с числами любой длины, а когда это делает компьютер, то нужно иметь в виду, что компьютеры всегда работают с моделью чисел, а не с числами любой длины, и отдельного знака "-" у них нет.

По этому отрицательные числа в модели с которой работает компьютер в качестве знака отрицания используют самый левый разряд модели и если он установлен в 1, то значит число воспринимается как отрицательное.

И теперь подытожу: если вы перемножаете много положительных чисел, то может сложиться такая ситуация что размер полученного результата может быть длиннее чем имеющаяся размерность используемой модели (int в java 32 бита; lond в java 64 бита), и тогда все лишние левые разряды которые "не вместились" просто отбрасываются компьютерами и результат получается уже не верным, а если на крайнем бите в используемой модели числа оказывается 1, то результат оказывается не верным, да ещё и отрицательным.

Этот процесс называется целочисленное переполнение.

→ Ссылка