Existe esta función Javascript que estoy tratando de reescribir en Java:
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
Mi adaptación de Java:
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
Cuando paso -1954896768
, la versión de Javascript regresa 70528
, mientras que Java regresa -896768
. No estoy seguro de por qué. La diferencia parece comenzar dentro de la condición if: en función Javascript después de que el caso encodingRound2 = 2340070528
, mientras que en Java: encodingRound2 = -1954896768
.
Hice estas respuestas para mostrarlo en línea:
Javascript : https://repl.it/repls/NumbGuiltyHack
Java : https://repl.it/repls/ClumsyQualifiedProblem
EDITAR : Cambiar la función de Java a esto
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return (encondindRound2 % 1_000_000);
}
no parece afectar el resultado, sigue siendo -896768
javascript
java
analizador
fuente
fuente
encondindRound2
a unint
código Java? Como se define como along
, potencialmente perderá precisión si lo convierte en un tipo más estrecho.long
dio resultados diferentes, debido al desbordamiento.(int)
lanzamiento de lareturn
línea no cambia el resultado de Java, permanece-896768
... + 0x80000000
, Java convierte el valor en int, porque0x80000000
se considera que es un literal int. Cambia ese número a0x80000000L
.Respuestas:
En Java, 0x80000000 está fuera del rango de 32 bits int, por lo que se ajusta a -2147483648.
En JavaScript, 0x80000000 está dentro del rango de un doble de 64 bits, por lo que sigue siendo 2147483648.
Obviamente, agregar
-2147483648
vs agregar2147483648
resultados en una gran discrepancia.Puede usar un
long
0x80000000L en Java, o coaccionar su número JS en un int de 32 bits(0x80000000|0)
, según lo que desee.fuente
Prueba esto. Debe especificar valores largos al realizar la conversión.
Pero hay otro problema que debe tener en cuenta. Javascript trata
%
como un operador de módulo donde Java lo trata como un simple operador restante. Mira esta publicación aquí para más información.fuente