Il y a cette fonction Javascript que j'essaie de réécrire en Java:
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
Mon adaptation Java:
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
Quand je passe -1954896768, la version Javascript revient 70528, tandis que Java revient -896768. Je ne sais pas pourquoi. La différence semble commencer à l' intérieur de la si la condition: en fonction Javascript après si encodingRound2 = 2340070528, tout en Java: encodingRound2 = -1954896768.
J'ai fait ces réponses pour le montrer en ligne:
Javascript : https://repl.it/repls/NumbGuiltyHack
Java : https://repl.it/repls/ClumsyQualifiedProblem
EDIT : modification de la fonction Java à ce
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return (encondindRound2 % 1_000_000);
}
ne semble pas affecter le résultat - c'est toujours -896768
longdonnait des résultats différents, à cause du débordement.
(int)casting de la returnligne ne change pas le résultat Java, il reste-896768
... + 0x80000000, Java convertit la valeur en entier, car il 0x80000000est considéré comme un littéral int. Remplacez ce nombre par 0x80000000L.
encondindRound2en unintdans le code Java? Puisqu'il est défini comme unlong, vous allez potentiellement perdre en précision si vous le transformez en un type plus étroit.