Java로 다시 작성하려고하는이 Javascript 함수가 있습니다.
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
내 자바 적응 :
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
내가 통과 -1954896768하면 Javascript 버전이 반환 70528되고 Java는 반환 -896768됩니다. 왜 그런지 잘 모르겠습니다. 자바 스크립트 함수에서 후 같은 경우의 차이는 경우 조건 내에서 시작하는 것 같다 encodingRound2 = 2340070528동안 자바 : encodingRound2 = -1954896768.
나는이 repls를 온라인으로 보여주기 위해 만들었습니다.
자바 스크립트 : https://repl.it/repls/NumbGuiltyHack
자바 : https://repl.it/repls/ClumsyQualifiedProblem
편집 : Java 기능을 이것으로 변경
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return (encondindRound2 % 1_000_000);
}
결과에 영향을 미치지 않는 것 같습니다-여전히 -896768
long오버플로로 인해 Java의 비트 단위로 비트 단위를 수행 할 때 다른 결과를 제공 할 때 전에 다른 코드 조각 에서이 문제가 발생했습니다 .
(int)로부터 캐스트 return자바 결과를 변경하지 않는 선을, 그것을 유지-896768
... + 0x80000000하면 Java는 0x80000000int 리터럴로 간주 되므로 값을 int로 변환합니다 . 해당 번호를로 변경하십시오 0x80000000L.
encondindRound2하는 이유는 무엇int입니까? 로 정의long되었으므로 더 좁은 유형으로 캐스팅하면 정밀도가 떨어질 수 있습니다.