Jest taka funkcja Javascript, którą próbuję przepisać w Javie:
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
Moja adaptacja Java:
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
Kiedy przechodzę -1954896768, wersja Javascript wraca 70528, a Java wraca -896768. Nie jestem pewien dlaczego. Różnica wydaje się zaczynać w warunku if: w funkcji JavaScript po if encodingRound2 = 2340070528, podczas gdy w Javie:encodingRound2 = -1954896768 .
Zrobiłem te repliki, aby pokazać to online:
JavaScript : https://repl.it/repls/NumbGuiltyHack
Java : https://repl.it/repls/ClumsyQualifiedProblem
EDYCJA : Zmiana funkcji Java na to
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return (encondindRound2 % 1_000_000);
}
wydaje się nie wpływać na wynik - nadal jest -896768
longdawało różne wyniki, z powodu przepełnienia.
(int)rzutowania z returnlinii nie zmienia wyniku Java, pozostaje-896768
... + 0x80000000przyłączysz, Java konwertuje wartość na liczbę całkowitą, ponieważ 0x80000000uważa się ją za literał int. Zmień ten numer na 0x80000000L.
encondindRound2dointkodu Java? Ponieważ jest zdefiniowany jakolong, potencjalnie stracisz precyzję, jeśli rzucisz go na węższy typ.