2012-02-17 9 views
6

जावास्क्रिप्ट में, ऐसा लगता है:जावास्क्रिप्ट बिटवाई क्यों है या अजीब तरीके से व्यवहार कर रहा है?

(4294958077 | 0) == -9219 

ऐसा क्यों है ४२९४९५८०७७ नहीं है?

यह पता चलता है वहाँ में लात अतिप्रवाह किसी प्रकार का है कि (हालांकि के रूप में मैं इसे समझ एक जावास्क्रिप्ट संख्या प्रकार की सीमा +/- 9007199254740992 है ताकि अपने आप में अजीब है।)

यहां तक ​​कि अगर यह एक अतिप्रवाह था, निश्चित रूप से

(4294958077 | 0) == 4294958077 

को सत्य के रूप में मूल्यांकन करना चाहिए - लेकिन ऐसा नहीं है।

मदद कृपया

+0

इसे देखें: 'चेतावनी ((42 9 4 9 58077 | 0));' – Smamatti

उत्तर

5

इसका फ़्लोटिंग पॉइंट प्रकार या ओवरफ्लो के साथ कुछ लेना देना नहीं है। यह रिटर्न -921 9 क्योंकि मानक इसे अनिवार्य करता है, क्योंकि 32-बिट पूर्णांक (ईसीएमए -262 § 11.10) पर हस्ताक्षर किए जाने के कारण सभी बाइनरी बिटवाई ऑपरेशंस किए जाने चाहिए।

उत्पादन एक: एक @बी, जहां @ ऊपर प्रस्तुतियों में बिटवाइज़ ऑपरेटर्स में से एक है, के रूप में इस मूल्यांकन किया जाता है:

  1. lref होने दो का मूल्यांकन करने का नतीजा।
  2. lval GetValue (lref) दें।
  3. rrefबी का मूल्यांकन करने का परिणाम बनें।
  4. रावल प्राप्त करें GetValue (rref)।
  5. lnum ToInt32 (lval) होने दें।
  6. rnum ToInt32 (rval) बनें।
  7. बिटवाई ऑपरेटर @ से lnum और rnum लागू करने का परिणाम लौटाएं। परिणाम एक हस्ताक्षर 32 बिट पूर्णांक है।

4294958077 एक हस्ताक्षरित 32-बिट पूर्णांक में बदल जाती (ECMA-262 में कलन विधि का उपयोग § 9.5) -9219 है, और 0 अभी भी 0 है, इसलिए बिटवाइज़-या -9219 वापस आ जाएगी।

+0

+1 जैसा दिखाया गया है (42 9 4 9 58077 | 0) >>> 0 === 4294958077 नहीं -921 9 –

2

सभी जावास्क्रिप्ट में संख्या 64 बिट चल बिन्दु संख्या हैं। फ्लोट्स पर बिटवाई ऑपरेशंस एक एज केस हैं, इसलिए आंतरिक रूप से उन फ्लोट्स को अस्थायी रूप से 32 बिट int में परिवर्तित कर दिया जाता है, फिर बिटवाई ऑपरेशन किया जाता है - इसलिए आपका ओवरफ़्लो।

0

जावास्क्रिप्ट बिटवाई नंबरों को हस्ताक्षरित 64-बिट फ्लोट के रूप में संग्रहीत किया जाता है, यानी आपके पास पूर्णांक के लिए उपयोग करने के लिए केवल 32-बिट्स हैं, जिन्हें आपने पार किया है, इसलिए यह इसे पूर्णांक में परिवर्तित करके अजीब हो गया है और फिर यह सबसे अच्छा है ऑपरेशन कर रहा हूँ

अधिक जानकारी here (विशेष रूप से '32-बिट' सेक्शन अनुभाग) लेकिन कोई वास्तविक समाधान नहीं है, इसलिए दुर्भाग्य से, आपको इसके आसपास काम करने की आवश्यकता होगी।

संबंधित मुद्दे