Ada fungsi Javascript yang saya coba tulis ulang di Java:
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
Adaptasi Java saya:
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
Ketika saya lulus -1954896768, versi Javascript kembali 70528, sedangkan Java kembali -896768. Saya tidak yakin mengapa. Perbedaannya tampaknya mulai dalam kondisi jika: dalam fungsi Javascript setelah jika encodingRound2 = 2340070528, sementara di Jawa: encodingRound2 = -1954896768.
Saya membuat balasan ini untuk ditampilkan secara online:
Javascript : https://repl.it/repls/NumbGuiltyHack
Java : https://repl.it/repls/ClumsyQualifiedProblem
EDIT : Mengubah fungsi Java untuk ini
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return (encondindRound2 % 1_000_000);
}
tampaknya tidak mempengaruhi hasilnya - masih -896768
longmemberikan hasil yang berbeda, karena overflow.
(int)gips dari returngaris tidak mengubah hasil Java, tetap-896768
... + 0x80000000, Java mengkonversi nilai menjadi int, karena 0x80000000dianggap sebagai int literal. Ubah nomor itu menjadi 0x80000000L.
encondindRound2keintdalam kode Java? Karena itu didefinisikan sebagailong, Anda akan berpotensi kehilangan presisi jika Anda melemparkannya ke tipe yang lebih sempit.