Умножение Java на одно и то же число возвращает другой результат в Python

Я переношу некоторый Java-код на Python, но по какой-то причине результаты отличаются.

Джава

int vi = 3997125 * 3997125;

Output: -270075495

питон

vi = 3997125 * 3997125

Output: 15977008265625

Как мне добиться того же вывода, который Java возвращает в Python?

Вы хотите получить неправильный результат (переполнение) в python?

Michael Szczesny 15.12.2020 14:31

Ага. Немного странно, я знаю. @MichaelSzczesny

zain 15.12.2020 14:32

В Java int подписывается так, что все, что больше 2^31, будет рассматриваться как отрицательное число. Итак, если вывод > 2 ^ 31, вместо этого выполните 2 ^ 31 - (значение).

AlBlue 15.12.2020 14:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
89
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Фрагмент Java переполняется. Чтобы избежать этого, вы можете использовать longs:

long vi = 3997125L * 3997125L;

Диапазон переменной, объявленной как тип int, составляет от -2 147 483 648 до 2 147 483 647.

Итак, когда вы делаете

3997125 * 3997125 = 15,977,008,265,625

который выходит за пределы допустимого диапазона для типа int.

Как было предложено, вы можете изменить тип на long .

Ответ принят как подходящий

Чтобы имитировать преобразование целого числа Python в 32-битное целочисленное значение с переполнением

def bit32(value):
    shift =  1 << 32
    return value % shift - shift if value.bit_length() >= 32 else value
bit32(3997125*3997125)

Вне:

-270075495

Обновлен мой ответ для работы с целыми числами без переполнения.

Michael Szczesny 15.12.2020 15:10

Другие вопросы по теме