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
long
donnait des résultats différents, à cause du débordement.
(int)
casting de la return
ligne ne change pas le résultat Java, il reste-896768
... + 0x80000000
, Java convertit la valeur en entier, car il 0x80000000
est considéré comme un littéral int. Remplacez ce nombre par 0x80000000L
.
encondindRound2
en unint
dans 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.