มีฟังก์ชัน Javascript ที่ฉันพยายามเขียนใน Java:
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มา ฉันไม่แน่ใจว่าทำไม ความแตกต่างที่ดูเหมือนว่าจะเริ่มต้นภายในถ้าเงื่อนไข: ในฟังก์ชั่นจาวาสคริหลังจากที่ถ้าencodingRound2 = 2340070528ในขณะที่ใน encodingRound2 = -1954896768Java:
ฉันสร้างข้อความจำลองเหล่านี้เพื่อแสดงทางออนไลน์:
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
... + 0x80000000Java จะแปลงค่าเป็น int เพราะ0x80000000ถือว่าเป็นตัวอักษรที่แท้จริง เปลี่ยนหมายเลข0x80000000Lนั้นเป็น
encondindRound2ถึงเลือกที่จะintอยู่ในจาวาโค้ด? เนื่องจากมันถูกนิยามว่าเป็น alongคุณจะสูญเสียความแม่นยำหากคุณใช้แบบแคบ