Почему длинный 2500000000 переполнен? - PullRequest
0 голосов
/ 07 мая 2019

Насколько я понимаю, long в Java имеет максимальное значение 2 ^ 63-1. Любые идеи, почему при хранении 50000 ^ 2 = 2500000000 в длинном я получаю -1794967296 с учетом 2500000000 меньше, чем 2 ^ 63-1? Спасибо

    long l = 50000 * 50000;
    System.out.println(l);

Я ожидаю, что на выходе будет 2500000000, но фактический результат равен -1794967296.

1 Ответ

1 голос
/ 07 мая 2019

В соответствии с Спецификацией языка Java :

Если целочисленное умножение переполняется, то результатом являются младшие биты математического произведения, представленные в некоторых достаточно большихдва дополнения формата.В результате, если происходит переполнение, знак результата может не совпадать со знаком математического произведения двух значений операнда.

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

Вы должны явно использовать длинные литералы:

 long l = 50000L * 50000L;
 long l = 50000L * 50000; // this also works

или привести к длинному перед умножением:

 long l = ((long) 50000) * ((long)50000);
 long l = ((long) 50000) * 50000; // this also works

См. spec , чтобы понять, почему достаточно явно использовать только один длинный литерал или один приведение к long.

...