दिलचस्प पोस्ट
क्या जावास्क्रिप्ट में अंतरफलक प्रकार है (जैसे कि जावा का 'इंटरफेस')? पायथन 3.2 urllib2 आयात करने में असमर्थ (आयातई त्रुटि: urllib2 नामक कोई मॉड्यूल नहीं है) चयन स्टार्ट / चयनआपके इनपुट प्रकार = "संख्या" पर अब क्रोम में अनुमति नहीं है एक फाइल और एसोसिएटेड डाटा पोस्टिंग एक रेंटल वेबएस सेवा को अधिमानतः JSON के रूप में मैं स्थापित MSI सेटअप के उत्पाद GUID को कैसे प्राप्त करूं? क्या मैं चुनिंदा तत्वों के लिए विकल्प में एचटीएमएल टैग का उपयोग कर सकता हूं? मैं कैसे जांचूं अगर stdin के पास कुछ डेटा है? एंड्रॉइड मैप एपीआई v2 के साथ कस्टम-आकार के बिटमैप मार्कर कैसे बनाएं क्या मुझे एंड्रॉइड का उपयोग करना चाहिए: प्रक्रिया = "रिमोट" मेरे रिसीवर में? सी # में संग्रहीत कार्यप्रणाली से वापसी मूल्य प्राप्त करना वार्गेंट का पोर्ट अग्रेषण काम नहीं कर रहा मैं Rails पर रूबी के साथ JSON को कैसे पार्स कर सकता हूं? नोडज एक्सप्रेस और जो मैं उम्मीद करता हूं वह नहीं करता जावा कम्पाइलर API का उपयोग करते समय शून्य सूचक अपवाद स्थिर बनाम एक्सटर्न "सी" / "सी ++"

जब एक द्विआधारी ऑपरेटर के दोनों तरफ हस्ताक्षर भिन्न होते हैं तो प्रचार नियम कैसे काम करते हैं?

निम्नलिखित कार्यक्रमों पर विचार करें:

// http://ideone.com/4I0dT #include <limits> #include <iostream> int main() { int max = std::numeric_limits<int>::max(); unsigned int one = 1; unsigned int result = max + one; std::cout << result; } 

तथा

 // http://ideone.com/UBuFZ #include <limits> #include <iostream> int main() { unsigned int us = 42; int neg = -43; int result = us + neg; std::cout << result; } 

कैसे + ऑपरेटर "पता" है जो वापस जाने के लिए सही प्रकार है? सामान्य नियम सभी तर्कों को व्यापक प्रकार के रूप में परिवर्तित करने के लिए है, लेकिन यहां कोई अंतर "विजेता" नहीं है जो कि int और unsigned int बीच है। पहले मामले में, unsigned int को operator+ के परिणाम के रूप में चुना जाना चाहिए, क्योंकि मुझे 2147483648 परिणाम मिलते हैं। दूसरे मामले में, यह int चुनना चाहिए, क्योंकि मुझे -1 परिणाम मिलता है फिर भी मैं सामान्य मामले में नहीं देखता कि यह कैसे तय है। क्या यह अपरिभाषित व्यवहार मैं देख रहा हूं या कुछ और?

वेब के समाधान से एकत्रित समाधान "जब एक द्विआधारी ऑपरेटर के दोनों तरफ हस्ताक्षर भिन्न होते हैं तो प्रचार नियम कैसे काम करते हैं?"

यह स्पष्ट रूप से §5 / 9 में उल्लिखित है:

कई द्विआधारी ऑपरेटरों को उम्मीद है कि अंकगणितीय या गणण प्रकार के कारण रूपांतरण और उपज परिणाम वाले प्रकार के समान रूप में अपेक्षाएं होती हैं। इसका उद्देश्य आम प्रकार की उपज है, जो परिणाम का प्रकार भी है। इस पैटर्न को सामान्य अंकगणित रूपांतरण कहा जाता है, जिसे निम्न प्रकार से परिभाषित किया जाता है:

  • यदि या तो ऑपरेंड long double प्रकार के प्रकार के long double , तो दूसरे को long double बदल दिया जाएगा।
  • अन्यथा, यदि कोई ऑपरेंड double , तो दूसरे को double बदल दिया जाएगा।
  • अन्यथा, यदि कोई ऑपरैंट float , तो दूसरे को float कनवर्ट किया जाएगा।
  • अन्यथा, अभिन्न प्रचार दोनों प्रचालनों पर किया जाएगा
  • इसके बाद, यदि कोई ऑपरेशन unsigned long नहीं किया गया है तो अन्य को unsigned long परिवर्तित किया जाएगा।
  • अन्यथा, यदि एक ऑपरैन्ड एक long int और अन्य unsigned int , तो यदि एक unsigned int सभी मानों को long int जा सकता है, तो unsigned int को long int परिवर्तित किया जाएगा; अन्यथा दोनों operands को unsigned long int परिवर्तित किया जाएगा
  • अन्यथा, यदि कोई ऑपरेंड long , तो दूसरे को long परिवर्तित किया जाएगा।
  • अन्यथा, यदि कोई ऑपरेशन unsigned , तो अन्य को unsigned रूपांतरित कर दिया जाएगा।

[ नोट : अन्यथा, एकमात्र शेष मामला यह है कि दोनों ऑपरेंड्स int ]

आपके दोनों परिदृश्य में, operator+ का परिणाम unsigned नतीजतन, दूसरा परिदृश्य प्रभावी है:

 int result = static_cast<int>(us + static_cast<unsigned>(neg)); 

क्योंकि इस मामले में us + neg का मान us + neg , int द्वारा प्रतिनिधित्व नहीं करता है, result का मूल्य कार्यान्वयन-परिभाषित है – §4.7 / 3:

यदि गंतव्य प्रकार पर हस्ताक्षर किए गए हैं, मान गंतव्य प्रकार (और बिट-फ़ील्ड चौड़ाई) में प्रदर्शित किया जा सकता है, तो मान अपरिवर्तित है; अन्यथा, मूल्य कार्यान्वयन-परिभाषित है।

सी को मानकीकृत करने से पहले, कंपाइलर्स के बीच मतभेद होते थे – कुछ का पालन "नियमों का मूल्य" और अन्य "नियमों के संरक्षण पर हस्ताक्षर" करते थे संरेखण रखने का मतलब है कि यदि कोई ऑपरेशन अहस्ताक्षरित हो, तो परिणाम अहस्ताक्षरित हो गया था। यह आसान था, लेकिन कई बार आश्चर्यजनक नतीजे दिए गए (खासकर जब एक ऋणात्मक संख्या एक अहस्ताक्षरित में परिवर्तित हो गई थी)

सी बल्कि अधिक जटिल "मूल्य संरक्षण" नियमों पर मानकीकृत है। नियमों के संरक्षण के मूल्य के तहत, पदोन्नति / प्रकार की वास्तविक श्रेणियों पर निर्भर करता है, इसलिए आप अलग-अलग कंपाइलर पर अलग-अलग परिणाम प्राप्त कर सकते हैं। उदाहरण के लिए, अधिकांश एमएस-डीओएस कंपाइलर पर, int एक ही आकार के रूप में short और long या तो से भिन्न होता है कई मौजूदा प्रणालियों पर एक ही आकार long के समान होता है, और short भी या तो से भिन्न होता है नियमों के संरक्षण के मूल्य के साथ, इन दोनों के बीच अलग-अलग प्रमोदित प्रकार हो सकते हैं।

मानों के संरक्षण के मूल्य का बुनियादी विचार यह है कि वह बड़े हस्ताक्षरित प्रकार को बढ़ावा देगा यदि वह छोटे प्रकार के सभी मूल्यों का प्रतिनिधित्व कर सकता है उदाहरण के लिए, एक 16-बिट unsigned short को 32-बिट signed int प्रमोशन किया जा सकता है, क्योंकि unsigned short हर संभव मूल्य को signed int रूप में प्रदर्शित किया जा सकता है। प्रकार एक अहस्ताक्षरित प्रकार के लिए प्रोत्साहित किए जाएंगे और यदि तभी छोटे प्रकार के मूल्यों को संरक्षित करने के लिए आवश्यक हो (उदाहरण के लिए, यदि unsigned short और signed int दोनों 16 बिट हैं, तो signed int , unsigned short सभी संभावित मूल्यों का प्रतिनिधित्व नहीं कर सकता है unsigned short , इसलिए एक unsigned short को unsigned int को बढ़ावा दिया जाएगा)।

जब आप परिणाम को आपके पास देते हैं, तो परिणाम गंतव्य प्रकार में वैसे भी परिवर्तित हो जाता है, इसलिए इनमें से अधिकतर अपेक्षाकृत थोड़ा अंतर होता है – कम से कम सबसे सामान्य मामलों में, जहां परिणाम में बिट्स की प्रतिलिपि बनायेगी, और यह तय करने के लिए कि आपके हस्ताक्षर या अहस्ताक्षरित के रूप में व्याख्या करना है या नहीं।

जब आप परिणाम की तुलना करें तो तुलनात्मक रूप से चीजें बदसूरत हो सकती हैं। उदाहरण के लिए:

 unsigned int a = 5; signed int b = -5; if (a > b) printf("Of course"); else printf("What!"); 

नियमों को बनाए रखने के लिए हस्ताक्षर के तहत, b को अहस्ताक्षरित करने के लिए प्रोत्साहित किया जाएगा, और प्रक्रिया में UINT_MAX - 4 बराबर हो, तो "क्या!" if ले लिया जाएगा का पैर नियमों के संरक्षण के मूल्य के साथ, आप इस तरह से कुछ अजीब परिणाम कुछ भी उत्पन्न कर सकते हैं , लेकिन 1) मुख्य रूप से डॉस-जैसी सिस्टम पर जहां int समान आकार short , और 2) यह किसी भी तरह से करना कठिन है।

यह जो भी प्रकार आप अपने परिणाम में या कम से कम cout को चुनते हैं, वह उस प्रकार के उत्पादन के दौरान सम्मान कर रहा है।

मुझे यकीन के लिए याद नहीं है, लेकिन मुझे लगता है कि सी ++ कंपाइलर दोनों के लिए एक ही अंकगणित कोड उत्पन्न करते हैं, यह केवल तुलना करता है और आउटपुट होता है जो कि साइन के बारे में ध्यान रखता है