2009-12-10 18 views
9

यह प्रश्न this question का डुप्लिकेट नहीं है।मुझे नकारात्मक मूल्य से अजीब नतीजे क्यों मिल रहे हैं?

मैं ऐसी परिस्थिति में आया जहां मुझे नकारात्मक मूल्य से एक (सकारात्मक) संख्या छोड़नी पड़ेगी, यानी 8 < < -1। उस स्थिति में, मैं परिणाम 4 होने की उम्मीद करता हूं, लेकिन मैंने पहले कभी ऐसा नहीं किया था।

i = -8, 8 << -8 = 134217728 
i = -7, 8 << -7 = 268435456 
i = -6, 8 << -6 = 536870912 
i = -5, 8 << -5 = 1073741824 
i = -4, 8 << -4 = -2147483648 
i = -3, 8 << -3 = 0 
i = -2, 8 << -2 = 0 
i = -1, 8 << -1 = 0 
i = 0, 8 << 0 = 8 
i = 1, 8 << 1 = 16 
i = 2, 8 << 2 = 32 
i = 3, 8 << 3 = 64 
i = 4, 8 << 4 = 128

किसी को भी इस व्यवहार की व्याख्या कर सकते हैं:

for (int i = -8; i <= 4; i++) 
    Console.WriteLine("i = {0}, 8 << {0} = {1}", i, 8 << i);

जो मेरे सदमे और आश्चर्य करने के लिए मेरा पीछा उत्पादन दे दी है: तो मैं एक छोटे से परीक्षण कार्यक्रम मेरी परिकल्पना सत्यापित करने के लिए बना?

यहां थोड़ा बोनस है। मैंने बाएं-शिफ्ट को दाएं-शिफ्ट में बदल दिया, और यह आउटपुट मिला:

i = -8, 8 >> -8 = 0 
i = -7, 8 >> -7 = 0 
i = -6, 8 >> -6 = 0 
i = -5, 8 >> -5 = 0 
i = -4, 8 >> -4 = 0 
i = -3, 8 >> -3 = 0 
i = -2, 8 >> -2 = 0 
i = -1, 8 >> -1 = 0 
i = 0, 8 >> 0 = 8 
i = 1, 8 >> 1 = 4 
i = 2, 8 >> 2 = 2 
i = 3, 8 >> 3 = 1 
i = 4, 8 >> 4 = 0

उत्तर

12

आप ऋणात्मक मूल्य से नहीं बदल सकते हैं। आप भी एक बड़ी सकारात्मक संख्या से स्थानांतरित नहीं कर सकते हैं।

If first operand is an int or uint (32-bit quantity), 
the shift count is given by the low-order five bits of second operand. 

... 


The high-order bits of first operand are discarded and the low-order 
empty bits are zero-filled. Shift operations never cause overflows. 
8

सी जैसी भाषाओं << -1>> 1 लिए अनुवाद नहीं करता है में:

सी # कल्पना ( http://msdn.microsoft.com/en-us/library/a1sway8w.aspx) से

। इसके बजाय शिफ्ट के कम-से-कम 5 बिट्स ले लिए जाते हैं और शेष को अनदेखा किया जाता है, इसलिए इस मामले में दोनों के पूरक -1<< 31 पर अनुवाद करते हैं।

आपको इसी तरह के परिणाम मिलेंगे। जावास्क्रिप्ट javascript:alert(8<<-8)

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