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
javascript
java
parsecer
źródło
źródło
encondindRound2
doint
kodu Java? Ponieważ jest zdefiniowany jakolong
, potencjalnie stracisz precyzję, jeśli rzucisz go na węższy typ.long
dawało różne wyniki, z powodu przepełnienia.(int)
rzutowania zreturn
linii nie zmienia wyniku Java, pozostaje-896768
... + 0x80000000
przyłączysz, Java konwertuje wartość na liczbę całkowitą, ponieważ0x80000000
uważa się ją za literał int. Zmień ten numer na0x80000000L
.Odpowiedzi:
W Javie 0x80000000 jest poza zakresem 32-bitowej int, więc zawija się do -2147483648.
W JavaScript, 0x80000000 mieści się w zakresie podwójnego 64-bitowego, więc pozostaje 2147483648.
Oczywiście dodawanie
-2147483648
a dodawanie2147483648
powoduje bardzo dużą rozbieżność.Możesz użyć
long
0x80000000L w Javie lub zmusić swój numer JS do 32-bitowej int(0x80000000|0)
, w zależności od tego, co chcesz.źródło
Spróbuj tego. Musisz podać długie wartości podczas konwersji.
Ale jest jeszcze jedna kwestia, o której powinieneś wiedzieć. JavaScript traktuje
%
jak operator modulo, gdzie Java traktuje go jako prosty operator reszty. Sprawdź ten post tutaj, aby uzyskać więcej informacji.źródło