2012-12-27 36 views
5

बिटवाइज़ संचालन के साथ कुछ परीक्षण कर रहा/जावास्क्रिप्ट के साथ स्थानांतरणजावास्क्रिप्ट में 0x80000000 >> 1 नकारात्मक मूल्य क्यों उत्पन्न करता है?

0x80000000 >> 1 // returns -1073741824 (-0x40000000) 

मुझे लगता है कि जब से

0x40000000 >> 1 // returns 0x20000000 
0x20000000 >> 1 // returns 0x10000000 
+3

ऐसा इसलिए है क्योंकि 0x800 ... 0b10000 है ..., और जब आप इसे सही स्थानांतरित करते हैं तो यह 0b1100 ..., ऋणात्मक संख्या बन जाता है। दूसरी तरफ, 0x400 ... 0b0100 है ... और 0x200 ... 0b0010 है ... और उन्हें यह समस्या नहीं है। – NullUserException

+0

@NullUserException क्षमा करें अगर यह बहुत ही बुनियादी चीजें है, लेकिन यह 0b0100 क्यों नहीं बनती है ...? 0x80 .. स्थानांतरित किया जा सकता है तो यह एक सकारात्मक 0x40 पैदा करता है ..? – lostsource

+0

@NullUserException: उत्तर –

उत्तर

9

यह एक arithmetic shift है यही कारण है कि हस्ताक्षर संरक्षित है 0x40000000 वापस जाने के लिए उम्मीद करेंगे, एक logical shift उपयोग करने के लिए >>>

0x80000000 >>> 1 // returns 1073741824 (0x40000000) 
3

जावास्क्रिप्ट में, >> है सही शिफ्ट ऑपरेटर पर हस्ताक्षर किए। language specification की §11.7.2 में यह कहते हैं:

राशि सही संकार्य द्वारा निर्दिष्ट द्वारा बाईं संकार्य पर एक साइन भरने बिटवाइज़ सही पारी आपरेशन करता है।

स्थानांतरण करने से पहले, बाएं ऑपरेंड को 32-बिट पूर्णांक (विनिर्देश में दिए गए एल्गोरिदम के चरण 5) में परिवर्तित किया जाता है। आपके मामले में यह रूपांतरण दिए गए सकारात्मक संख्या को ऋणात्मक मान में बदल देता है। उसके बाद, वास्तविक स्थानांतरण, मूल्य के नकारात्मक संकेत को संरक्षित किया जाता है।