मानक परिभाषित नहीं करता है, या इसके बजाय, यह इसे "अपरिभाषित व्यवहार" के रूप में परिभाषित करता है, मामले में पूर्णांक प्रकार के आकार से परे बाएं शिफ्ट में क्या होता है। [इस अपरिभाषित व्यवहार का कारण यह है कि अलग-अलग हार्डवेयर वही व्यवहार कर सकते हैं या नहीं, उदाहरण के लिए, बाईं ओर 32-बिट शिफ्ट]। जो 86 पर 1 << (32 & 31)
में बदल जाता है जो एक ही 1 << 0
के रूप में - -
पहला मामला [कम से कम अनुकूलन के बिना] में, संकलक 1 << 32
की गणना करने के निर्देश उत्पन्न करता है और इस प्रकार आप प्राप्त 1.
दूसरे मामले में, संकलक मूल्य की गणना करेगा, जो एक अतिप्रवाह में बदल जाता है, और शून्य देता है।
यह काफी संभावना है (लेकिन निश्चित नहीं है) कि यदि आप कोड को अनुकूलित करने के लिए कंपाइलर विकल्प बदलते हैं, तो यह दोनों मामलों के लिए शून्य देता है। और यदि आप छोटे बदलावों का एक लूप करना चाहते हैं तो आपको वह व्यवहार प्राप्त करने जा रहे हैं (हालांकि आपको इस तथ्य के साथ "इंटरस्टिंग" व्यवहार मिल सकता है कि संख्या नकारात्मक हो जाती है, इसलिए वास्तव में सभी शिफ्ट परिचालनों के लिए हस्ताक्षरित उपयोग करने के लिए सबसे अच्छा है) ।
स्रोत
2013-05-13 05:53:23
कोड विकसित करते समय चेतावनियों को हमेशा सक्षम और पढ़ें। उदाहरण के लिए जीसीसी आपको "बाएं शिफ्ट गिनती> = प्रकार की चौड़ाई" बताती है। क्लैंग के '-fsanitize = ...' विकल्प का उपयोग करना भी एक अच्छा विचार है। –
जो कोड आप पोस्ट कर रहे हैं वह स्पष्ट रूप से सी ++ है, लेकिन आप सी के साथ टैग भी करते हैं? दोनों भाषाएं इस तरह के सीमावर्ती मामलों पर विचलित होती हैं, इसलिए उस भाषा के लिए बेहतर प्रश्न पूछें, जिसमें आप वास्तव में रुचि रखते हैं। आम तौर पर हस्ताक्षर किए गए प्रकारों पर शिफ्ट संचालन करना अच्छा नहीं है। –