राइट शिफ्ट ऑपरेटर का दिलचस्प व्यवहार
राइट-शिफ्ट ऑपरेटर (>>) बड़े राइट शिफ्ट मूल्यों के साथ काम करते समय अजीब व्यवहार प्रदर्शित करता है। निम्नलिखित कार्यक्रम पर विचार करें:
#include
#include
int foo(int a, int b)
{
return a >> b;
}
int bar(uint64_t a, int b)
{
return a >> b;
}
int main()
{
std::cout > 32: " > 32) > (int)32: " > (int)32) foo(1,32) के लिए अपेक्षित आउटपुट 0 होगा, लेकिन आश्चर्यजनक रूप से, यह 1 देता है। इसका श्रेय निम्नलिखित को दिया जा सकता है:
लॉजिकल शिफ्ट बनाम अंकगणित Shift
x86/x86-64 आर्किटेक्चर पर, राइट-शिफ्ट ऑपरेटर वास्तव में एक लॉजिकल राइट शिफ्ट का प्रदर्शन कर रहा है, जिसका अर्थ है कि यह खाली बिट्स को 0 से भरता है, चाहे कुछ भी हो बाएँ संकार्य का चिह्न. व्यवहार a >>> b.
कंपाइलर ऑप्टिमाइज़ेशन
foo(1, 32) के मामले में, मान 32 पर डाला जा रहा है int, जिसे प्रभावी रूप से 32 बिट्स तक छोटा कर दिया गया है। चूंकि एक पूर्णांक का अधिकतम मान 231-1 है, सही बदलाव अनिवार्य रूप से एक >>> (32 % 32) है, जिसका मूल्यांकन 0 है।
अपरिभाषित व्यवहार
प्रासंगिक सी मानक बताता है कि प्रचारित बाएं ऑपरेंड की चौड़ाई से अधिक या उसके बराबर गिनती के साथ दाएं बदलाव के लिए "व्यवहार अपरिभाषित है"। इस मामले में, 1 >> 32 और (int)1 >> (int)32 दोनों की गिनती 32 से अधिक है, जिससे अप्रत्याशित परिणाम मिलते हैं।
bar(1, 32) के साथ अंतर &&&]
फ़ंक्शन बार एक 64-बिट अहस्ताक्षरित पूर्णांक लेता है, जिसकी चौड़ाई 32 से अधिक होने की गारंटी है। इसलिए, बार में सही बदलाव अपरिभाषित व्यवहार से प्रभावित नहीं होता है। निष्कर्ष
बड़े शिफ्ट मूल्यों के साथ काम करते समय राइट-शिफ्ट ऑपरेटर का व्यवहार अस्पष्ट हो जाता है। x86/x86-64 आर्किटेक्चर पर, एक तार्किक राइट शिफ्ट किया जाता है, जबकि एआरएम पर, एक अलग कार्यान्वयन का उपयोग किया जा सकता है। अपरिभाषित व्यवहार के कारण, ऑपरेंड की चौड़ाई से अधिक या उसके बराबर गिनती के साथ सही बदलाव के परिणाम को पोर्टेबल कोड में टाला जाना चाहिए।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3