मुझे यहां बिल्कुल पागल होना चाहिए, लेकिन मेरी मशीन पर gcc 4.7.3
सबसे बेतुका परिणाम दे रहा है।अंकगणित सही शिफ्ट फर्जी परिणाम देता है?
#include <iostream>
using namespace std;
int main(){
unsigned int b = 100000;
cout << (b>>b) << endl;
b = b >> b;
cout << b << endl;
b >>= b;
cout << b << endl;
return 0;
}
अब, किसी भी संख्या है कि सही अपने आप में स्थानांतरित कर दिया है में (n/(2^n) == 0
पूर्णांक विभाजन, n>1
, और सकारात्मक साथ/अहस्ताक्षरित) परिणाम चाहिए: यहाँ सटीक कोड है कि मैं परीक्षण कर रहा हूँ है , लेकिन किसी भी तरह मेरा आउटपुट यहां है:
100000
100000
100000
क्या मैं पागल हूं? संभवतः क्या हो सकता है?
@ShafikYaghmour: यह संकलक मानता है एक निर्देश में डाल भी परेशान है। इस कार्यक्रम को अस्वीकार करने के अपने अधिकार में यह ठीक है। – MSalters
@MSalters वास्तव में, हम इस बिंदु पर विशिष्ट संकलक/मंच/संस्करण में शामिल हो रहे हैं लेकिन वर्तमान और हाल के संस्करणों के लिए यह मामला है और जैसा कि मैंने पहले ही कहा है कि यह अनिर्धारित है, इसलिए आप स्पष्ट रूप से अपने आप हैं, 'gcc' केवल ऐसा लगता है '-O0' का उपयोग करते समय 'shr' का उत्पादन करें। –
@ShafikYaghmour: इंटेल जीसीसी द्वारा समर्थित कई प्लेटफार्मों में से एक है, और उनके पास अलग-अलग अनुकूलन चरण हैं। ऑप्टिमाइज़ेशन में एक आम चाल यह कहना है कि "यह मान केवल 0 और 31 के बीच हो सकता है क्योंकि इसका उपयोग शिफ्ट में किया जाता है, अगर मैं कोड प्राप्त करने के लिए कोड पथ एक्स का पालन करता हूं तो मान 0 और 31 के बीच नहीं होगा, इसलिए कोड पथ एक्स असंभव है और मुझे इसके लिए निर्देश उत्पन्न करने की भी आवश्यकता नहीं है "। जीसीसी प्रसिद्ध रूप से शून्य सूचक जांच के लिए करता है। – MSalters