जावा में फिर से लिखा गया जावास्क्रिप्ट फ़ंक्शन अलग परिणाम देता है


9

यह जावास्क्रिप्ट फ़ंक्शन है जिसे मैं जावा में फिर से लिखने की कोशिश कर रहा हूं:

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, तो जावास्क्रिप्ट संस्करण वापस आ जाता है 70528, जबकि जावा वापस आ जाता है -896768। मुझे यकीन नहीं है कि क्यों। अंतर यह है कि अगर हालत के अंदर शुरू होता है encodingRound2 = 2340070528: जावा के बाद जावास्क्रिप्ट फ़ंक्शन में , जबकि encodingRound2 = -1954896768:।

मैंने इन्हें ऑनलाइन दिखाने के लिए ये उत्तर दिए:

जावास्क्रिप्ट : https://repl.it/repls/NumbGuiltyHack

जावा : https://repl.it/repls/ClumsyQualifiedProblem

संपादित करें : जावा फ़ंक्शन को इसमें बदलना

public long normalizeHash(long encondindRound2) {
        if (encondindRound2 < 0) {
            encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
        }
        return (encondindRound2 % 1_000_000);
    }

परिणाम को प्रभावित नहीं करता है - यह अभी भी है -896768


1
तुम क्यों कास्ट कर रहे हैं encondindRound2एक करने के लिए intजावा कोड में? चूंकि यह एक के रूप में परिभाषित है long, आप संभावित रूप से सटीक खो सकते हैं यदि आप इसे एक संकीर्ण प्रकार में डालते हैं।
जॉर्डन

1
@ जोर्डन क्योंकि - अगर अंदर - उस पर एक बिटवाइज़ ऑपरेशन किया जा रहा है। जावास्क्रिप्ट, हालांकि 64-बिट फ़्लोट के रूप में संख्याओं को संग्रहीत करना, जब बिटवाइज़ करते हैं, तो संख्याओं को 32-बिट पूर्णांक में परिवर्तित करता है। कोड के एक और टुकड़े के साथ मेरे पास यह मुद्दा था, जब longअतिप्रवाह के कारण जावा के अलग-अलग परिणाम दिए गए थे।
पारसकर

(int)कास्ट को returnलाइन से हटाने से जावा रिजल्ट नहीं बदलता है, यह बना रहता है-896768
21

4
आह, मुझे मुद्दा मिल गया। जब आप डील करते हैं ... + 0x80000000, तो जावा वैल्यू को एक इंट में बदल देता है, क्योंकि 0x80000000इसे एक इंटर्नल माना जाता है। उस नंबर को बदल दें 0x80000000L
जॉर्डन

1
@ जोर्डन वाह, आप जादूगर हैं! इसने काम कर दिया! कृपया अपना उत्तर पोस्ट करें और मैं इसे स्वीकार करूंगा
parsecer

जवाबों:


9

जावा में, 0x80000000 32bit int की सीमा के बाहर है, इसलिए यह -2147483648 के आसपास घूमता है।

जावास्क्रिप्ट में, 0x80000000 64 बिट डबल की सीमा के अंदर है, इसलिए यह 2147483648 है।

जाहिर है, एक बहुत बड़ी विसंगति में परिणाम जोड़ना -2147483648बनाम जोड़ना 2147483648

आप या तो longजावा में 0x80000000L का उपयोग कर सकते हैं , या अपने JS नंबर को 32bit int में ले सकते हैं (0x80000000|0), जिसके आधार पर आप चाहते हैं।


2

इसे इस्तेमाल करे। रूपांतरण करने के लिए आपको लंबे मान निर्दिष्ट करने होंगे।

    public static long normalizeHash(long encondindRound2) {
        if (encondindRound2 < 0) {
            encondindRound2 =  (encondindRound2 & 0x7fffffffL) + 0x80000000L;
        }

        return  (encondindRound2 % 1_000_000);
    }

लेकिन एक और मुद्दा है जिसके बारे में आपको जानकारी होनी चाहिए। जावास्क्रिप्ट %एक मॉडुलो ऑपरेटर के रूप में व्यवहार करता है जहां जावा इसे एक साधारण शेष ऑपरेटर के रूप में मानता है। इस पोस्ट की जाँच करें यहाँ अधिक जानकारी के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.