Есть эта функция Javascript, которую я пытаюсь переписать в Java:
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
Моя адаптация Java:
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
Когда я передаю -1954896768, возвращается версия Javascript 70528, а возвращается Java -896768. Я не уверен почему. Разница , кажется, начинается внутри , если условие: в функции Javascript , если после того , как encodingRound2 = 2340070528, в то время как в Java: encodingRound2 = -1954896768.
Я сделал эти repls, чтобы показать это онлайн:
Javascript : https://repl.it/repls/NumbGuiltyHack
Java : https://repl.it/repls/ClumsyQualifiedProblem
РЕДАКТИРОВАТЬ : изменение функции Java на это
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return (encondindRound2 % 1_000_000);
}
кажется, не влияет на результат - это все еще -896768
longдавало разные результаты из-за переполнения.
(int)приведения из returnстроки не меняет результат Java, оно остается-896768
... + 0x80000000, Java преобразует значение в int, потому что 0x80000000считается литералом int. Измените это число на 0x80000000L.
encondindRound2приводитеintв код Java? Поскольку он определен как along, вы потенциально потеряете точность, если приведете его к более узкому типу.