私がJavaで書き直そうとしているこのJavascript関数があります:
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
私のJava適応:
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
渡すと-1954896768、Javascriptバージョンが返され70528、Javaが返されます-896768。理由はわかりません。違いは、ifの条件内で開始しているようだ:Javascriptの機能であれば後にencodingRound2 = 2340070528、Javaでしばらく:encodingRound2 = -1954896768。
オンラインで表示するためにこれらのreplを作成しました。
Javascript:https : //repl.it/repls/NumbGuiltyHack
Java: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、オーバーフローのために異なる結果が得られました。
(int)からキャストreturnのJava結果を変更しない行を、それが残っている-896768
... + 0x80000000、Javaは値をintに変換します。これ0x80000000は、intリテラルと見なされるためです。その番号をに変更し0x80000000Lます。
encondindRound2するのintですか?これはとして定義されてlongいるため、より狭い型にキャストすると精度が失われる可能性があります。