"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > C++ में राइट शिफ्ट ऑपरेटर (`>>`) 32 बिट्स द्वारा शिफ्ट करने पर अप्रत्याशित परिणाम क्यों देता है?

C++ में राइट शिफ्ट ऑपरेटर (`>>`) 32 बिट्स द्वारा शिफ्ट करने पर अप्रत्याशित परिणाम क्यों देता है?

2024-11-01 को प्रकाशित
ब्राउज़ करें:401

Why does the right shift operator (`>>`) सी में 32 बिट शिफ्ट होने पर अप्रत्याशित परिणाम मिलते हैं?
>`) सी में 32 बिट शिफ्ट होने पर अप्रत्याशित परिणाम मिलते हैं? " />

राइट शिफ्ट ऑपरेटर का अप्रत्याशित व्यवहार (1 >> 32)

प्रोग्रामिंग के दायरे में, राइट शिफ्ट ऑपरेटर (>>) का आमतौर पर उपयोग किया जाता है बिटवाइज़ संचालन करने के लिए, विशेष रूप से एक पूर्णांक को दो की शक्ति से विभाजित करने के लिए, बड़े मूल्यों द्वारा स्थानांतरित होने पर अजीब व्यवहार उत्पन्न हो सकता है, जैसा कि निम्नलिखित सी कोड द्वारा प्रदर्शित किया गया है:

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): 1 // Should be 0
bar(1, 32): 0
1 >> 32: 0
(int)1 >> (int)32: 0

इन परिणामों के पीछे का तर्क सीपीयू और कंपाइलर की आंतरिक कार्यप्रणाली में निहित है।

foo() फ़ंक्शन का व्यवहार

foo() फ़ंक्शन में, शिफ्ट ऑपरेशन बिना कास्ट के किया जाता है, जिससे सीपीयू तार्किक राइट शिफ्ट करता है। कई आर्किटेक्चर पर, लॉजिकल राइट शिफ्ट को >> (बी% 32) के रूप में लागू किया जाता है, जो प्रभावी रूप से बी के ऊपरी बिट्स को अनदेखा करता है। इसलिए, foo(1, 32) का परिणाम 1 >> (32 % 32) होता है, जिसका मूल्यांकन 1 >> 0 होता है, जिससे 1 प्राप्त होता है।

64-बिट पूर्णांक पर कास्टिंग क्यों मायने रखती है?

बार() फ़ंक्शन में, एक 64-बिट अहस्ताक्षरित पूर्णांक प्रदान किया जाता है, यह सुनिश्चित करते हुए कि परिणाम 0 होने की गारंटी है क्योंकि बी (32) ऑपरेंड में बिट्स की संख्या से कम है (64) ). हालाँकि, जब b को 64 में बदल दिया जाता है, तो परिणाम अप्रत्याशित हो जाता है और फिर भी 1 प्राप्त हो सकता है। )1 >> (int)32, कंपाइलर कंपाइल-टाइम पर इन निरंतर अभिव्यक्तियों को अनुकूलित करता है। मानक सही बदलावों के लिए अपरिभाषित व्यवहार को निर्दिष्ट करता है जहां गिनती नकारात्मक या ऑपरेंड की लंबाई से अधिक या उसके बराबर होती है। चूंकि 32 ऑपरेंड की लंबाई से अधिक है, कंपाइलर परिणाम निर्धारित नहीं कर सकता है और 0 को सुरक्षित फ़ॉलबैक के रूप में आउटपुट करता है।

सीपीयू-विशिष्ट व्यवहार

राइट शिफ्ट का कार्यान्वयन अलग-अलग सीपीयू में ऑपरेशन अलग-अलग हो सकते हैं। x86/x86-64 आर्किटेक्चर पर, लॉजिकल राइट शिफ्ट प्रभावी रूप से मोड के आधार पर >> (बी% 32 या 64) है। हालाँकि, एआरएम प्रोसेसर पर, राइट शिफ्ट ऑपरेशन 32 से अधिक या उसके बराबर शिफ्ट के लिए शून्य की गारंटी देता है।

निष्कर्ष

राइट शिफ्ट ऑपरेटरों के साथ काम करते समय, यह आवश्यक है संभावित अपरिभाषित व्यवहारों पर विचार करने के लिए, खासकर जब शिफ्ट गिनती ऑपरेंड की लंबाई से अधिक हो। व्यापक पूर्णांक प्रकारों, जैसे कि 64-बिट पूर्णांक, पर कास्टिंग करने से विभिन्न सीपीयू और कंपाइलरों में लगातार परिणाम सुनिश्चित हो सकते हैं।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3