Existe esta função Javascript que estou tentando reescrever em Java:
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
Minha adaptação Java:
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
Quando passo -1954896768, a versão Javascript retorna 70528, enquanto Java retorna -896768. Não sei por que. A diferença parece começar dentro da condição if: em função Javascript após o caso encodingRound2 = 2340070528, enquanto em Java: encodingRound2 = -1954896768.
Fiz essas réplicas para mostrá-lo on-line:
Javascript : https://repl.it/repls/NumbGuiltyHack
Java : https://repl.it/repls/ClumsyQualifiedProblem
EDIT : Alterando a função Java para este
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return (encondindRound2 % 1_000_000);
}
parece não afetar o resultado - ainda é -896768
longdeu resultados diferentes, por causa do estouro.
(int)elenco da returnlinha não altera o resultado do Java, ele permanece-896768
... + 0x80000000, Java converte o valor em um int, porque 0x80000000é considerado um literal int. Mude esse número para 0x80000000L.
encondindRound2para umintno código Java? Como é definido como along, você provavelmente perderá precisão se a converter para um tipo mais restrito.