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

199
14 апреля 2022, 20:20

При создании, классу 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; }
}
Answer 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, то результат оказывается не верным, да ещё и отрицательным.

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

READ ALSO
Java: JLabel не меняет своё положение

Java: JLabel не меняет своё положение

Я изучаю графическую библиотеку swing и столкнулся с проблемой - текст не изменяет своё положение относительно jpanel при изменении параметров...

239
C# Как скачать natives/ для майнкрафта

C# Как скачать natives/ для майнкрафта

Я пишу свой лаунчер МайнкрафтаМне нужны все библиотеки Майнкрафта (dll файлы, LWJGL, OpenAL и другие)

201