दिलचस्प पोस्ट
Sed में पर्यावरण चर प्रतिस्थापन AngularJS: वादे का प्रयोग कहाँ करना है? मल्टिप्रोसिंग कतार, पूल और लॉकिंग का उपयोग करने के लिए मृत सरल उदाहरण कैसे स्मृति leaks को रोकने के लिए node.js? टुकड़ों का उपयोग करके वापस ढेर साफ़ करें मैक ओएस एक्स पर पायथन 3 के लिए पीईपी कैसे स्थापित करें? मूल प्रक्रिया को मार दिया जाता है जब बाल प्रक्रिया को मार डालो आईओएस 8 रोटेशन मेथड अपेशन – पश्चगामी संगतता मैं परंपरागत नामकरण वाले रेल को ओवरराइड कैसे कर सकता हूं? Express.js पर HTTPS को सक्षम करना R.string प्रोग्राममेटिक रूप से मूल्य बदलें लकड़हारा (log4j) के लिए कोई अपेंडर्स नहीं मिला? मैं रैंड () के साथ यादृच्छिक संख्याओं का एक ही क्रम क्यों प्राप्त करता हूं? कैनवास toDataURL () केवल रिक्त छवि फ़ॉरेक्स में देता है गिट उपनाम – एकाधिक आदेश और पैरामीटर

अहस्ताक्षरित पूर्णांक ओवरफ़्लो परिभाषित व्यवहार क्यों नहीं है, पर हस्ताक्षर किए पूर्णांक अतिप्रवाह है?

अस्वाभावित पूर्णांक ओवरफ़्लो दोनों सी और सी ++ मानकों द्वारा अच्छी तरह से परिभाषित किया गया है। उदाहरण के लिए, C99 मानक ( §6.2.5/9 ) बताता है

अहस्ताक्षरित ऑपरेंडों से जुड़े एक गणना में कभी भी फ्लो ओव नहीं हो सकता, क्योंकि नतीजे जिसके परिणामस्वरूप अहस्ताक्षरित पूर्णांक प्रकार के द्वारा प्रतिनिधित्व नहीं किया जा सकता है, मॉड्यूल को कम किया जाता है जो कि सबसे बड़ा मान से बड़ा होता है जो परिणामस्वरूप प्रकार के द्वारा प्रस्तुत किया जा सकता है।

हालांकि, दोनों मानक मानते हैं कि पूर्णांक अतिप्रवाह पर हस्ताक्षर किए गए व्यवहार अनिर्धारित व्यवहार हैं। फिर, सी 99 मानक से ( §3.4.3/1 )

पूर्वनिर्धारित व्यवहार का एक उदाहरण यह है कि पूर्णांक पर पूर्णता पर व्यवहार होता है

क्या इस विसंगति के लिए एक ऐतिहासिक या (और भी बेहतर!) एक तकनीकी कारण है?

वेब के समाधान से एकत्रित समाधान "अहस्ताक्षरित पूर्णांक ओवरफ़्लो परिभाषित व्यवहार क्यों नहीं है, पर हस्ताक्षर किए पूर्णांक अतिप्रवाह है?"

ऐतिहासिक कारण यह है कि ज्यादातर सी कार्यान्वयन (कंपाइलर) का इस्तेमाल केवल अतिप्रवाह व्यवहार का उपयोग किया जाता था, जिसका प्रयोग पूर्णांक प्रतिनिधित्व के साथ किया गया था। सी कार्यान्वयन आमतौर पर सीपीयू द्वारा उपयोग किए गए समान प्रस्तुति का इस्तेमाल करते हैं – इसलिए अतिप्रवाह व्यवहार CPU द्वारा प्रयुक्त पूर्णांक प्रस्तुति से होता है।

व्यवहार में, यह केवल हस्ताक्षरित मूल्यों के लिए अभ्यावेदन है जो कार्यान्वयन के अनुसार भिन्न हो सकता है: एक के पूरक, दो पूरक, चिह्न-परिमाण एक अहस्ताक्षरित प्रकार के लिए मानक के लिए कोई भिन्न कारण देने की कोई वजह नहीं है क्योंकि केवल एक स्पष्ट बाइनरी प्रतिनिधित्व (मानक केवल द्विआधारी प्रतिनिधित्व की अनुमति देता है)

प्रासंगिक उद्धरण:

C99 6.2.6.1:3 :

अहस्ताक्षरित बिट-फ़ील्ड में संग्रहीत मान और प्रकार अहस्ताक्षरित कक्ष की वस्तुओं को शुद्ध बाइनरी नोटेशन का उपयोग करते हुए प्रदर्शित किया जाएगा।

C99 6.2.6.2 :

यदि हस्ताक्षर बिट एक है, मान निम्नलिखित तरीकों में से एक में संशोधित किया जाएगा:

– संदिग्ध बिट 0 के साथ संबंधित मान नकारात्मक ( संकेत और परिमाण ) है;

– हस्ताक्षर बिट में मूल्य है – (2 एन ) ( दो पूरक );

– हस्ताक्षर बिट में मूल्य है – (2 एन -1) ( एक के पूरक )।


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

पास्कल के अच्छे उत्तर के अलावा (जो मुझे यकीन है कि मुख्य प्रेरणा है), यह भी संभव है कि कुछ प्रोसेसर पर हस्ताक्षर किए पूर्णांक अतिप्रवाह पर एक अपवाद का कारण बनता है, जो निश्चित रूप से समस्याओं का कारण होगा यदि संकलक को "अन्य व्यवहार की व्यवस्था" करनी होती है जैसे संभावित ओवरफ्लो की जांच करने के लिए अतिरिक्त निर्देशों का उपयोग करें और उस मामले में अलग-अलग गणना करें)।

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

अन्य प्रश्नों के अतिरिक्त, अहस्ताक्षरित गणित लपेट होने के कारण अहस्ताक्षरित पूर्णांक प्रकार अस्वाभाविक बीजीय समूह के रूप में व्यवहार करता है (अर्थात्, अन्य बातों के अलावा, मूल्यों के किसी भी युग्म के लिए X और Y , कुछ अन्य मूल्य Z मौजूद होंगे, जैसे X+Z अगर ठीक से डाली जाए तो, Y और YZ , यदि ठीक से डाली जाए तो समान X बराबर होगा। अगर अहस्ताक्षरित मूल्य केवल भंडारण-स्थान प्रकार होते हैं और इंटरमीडिएट-अभिव्यक्ति के प्रकार नहीं होते हैं (उदाहरण के लिए यदि कोई सबसे अधिक पूर्णांक प्रकार के बिना कोई अहस्ताक्षरित समतुल्य था, और अहस्ताक्षरित प्रकार पर अंकगणित कार्रवाई का व्यवहार हुआ जैसा कि वे पहले उन्हें बड़े प्रकार के हस्ताक्षर किए गए प्रकार के रूप में परिवर्तित करते थे परिभाषित रैपिंग व्यवहार की जितनी ज्यादा आवश्यकता नहीं होगी, लेकिन ऐसे प्रकार में गणना करने में मुश्किल है, जो कि एक योजक उलटा नहीं है।

यह परिस्थितियों में मदद करता है जहां लपेट-आस-पास व्यवहार वास्तव में उपयोगी है – उदाहरण के लिए टीसीपी अनुक्रम संख्या या कुछ एल्गोरिदम, जैसे कि हैश गणना यह उन परिस्थितियों में भी मदद कर सकता है जहां ओवरफ्लो का पता लगाने के लिए आवश्यक है, गणनाओं को निष्पादित करने के बाद और यह पता लगाया जाता है कि क्या वे अतिप्रवाह कर रहे हैं या नहीं यह जाँचने से पहले आसान है कि क्या वे अतिप्रवाह करें, खासकर यदि गणना में सबसे बड़ा उपलब्ध पूर्णांक प्रकार शामिल है

सबसे पहले, कृपया ध्यान दें कि सभी उदाहरणों और पैर नोट्स की तरह C11 3.4.3, प्रामाणिक पाठ नहीं है और इसलिए उद्धृत करने के लिए प्रासंगिक नहीं है!

संबंधित पाठ जो बताता है कि पूर्णांक और फ़्लोट्स के अतिप्रवाह अपरिभाषित व्यवहार है:

C11 6.5 / 5

यदि एक असाधारण स्थिति एक अभिव्यक्ति के मूल्यांकन के दौरान होती है (अर्थात, यदि परिणाम गणितीय परिभाषित नहीं है या इसके प्रकार के लिए प्रतिनिधित्व योग्य मानों की श्रेणी में नहीं है), तो व्यवहार अनिर्धारित है।

अहस्ताक्षरित पूर्णांक प्रकार के व्यवहार के बारे में स्पष्टीकरण विशेष रूप से यहां पाया जा सकता है:

C11 6.2.5 / 9

हस्ताक्षरित पूर्णांक प्रकार के गैर-नकारात्मक मूल्यों की श्रेणी संगत अहस्ताक्षरित पूर्णांक प्रकार की एक उपनगरीय है, और प्रत्येक प्रकार के समान मूल्य का प्रतिनिधित्व समान है। अहस्ताक्षरित परिपथों में शामिल एक गणना कभी भी अतिप्रवाह नहीं हो सकती है, क्योंकि नतीजे जिसके परिणामस्वरूप अहस्ताक्षरित पूर्णांक प्रकार के द्वारा प्रतिनिधित्व नहीं किया जा सकता है, मॉड्यूल को कम किया जाता है जो कि सबसे बड़ा मान से बड़ा होता है जो परिणामस्वरूप प्रकार के द्वारा प्रस्तुत किया जा सकता है।

यह अहस्ताक्षरित पूर्णांक प्रकार विशेष केस बनाता है

यह भी ध्यान रखें कि यदि एक प्रकार एक हस्ताक्षरित प्रकार में कनवर्ट किया गया है और पुराने मान का प्रतिनिधित्व नहीं किया जा सकता है, तो एक अपवाद है। व्यवहार तब मात्र कार्यान्वयन-परिभाषित है, हालांकि एक संकेत उठाया जा सकता है।

C11 6.3.1.3

6.3.1.3 हस्ताक्षरित और अहस्ताक्षरित पूर्णांक

जब पूर्णांक प्रकार वाले मान को _Bool के अलावा अन्य पूर्णांक प्रकार में कनवर्ट किया जाता है, तो मान को नए प्रकार के द्वारा प्रस्तुत किया जा सकता है, यह अपरिवर्तित है।

अन्यथा, यदि नया प्रकार अहस्ताक्षरित नहीं है, तो मूल्य को अधिकतम मूल्य से अधिक एक बार जोड़कर या घटाना द्वारा परिवर्तित किया जाता है, जो नए प्रकार की श्रेणी में है, जब तक कि नए प्रकार में इसका प्रतिनिधित्व नहीं किया जा सकता।

अन्यथा, नए प्रकार पर हस्ताक्षर किए गए हैं और इसमें मूल्य का प्रतिनिधित्व नहीं किया जा सकता; या तो परिणाम कार्यान्वयन-परिभाषित है या एक कार्यान्वयन-परिभाषित संकेत उठाया है।

अहसासपूर्ण अंकगणितीय परिभाषित होने के कारण शायद एक और कारण यह है कि अहस्ताक्षरित संख्याएं पूर्णांक मॉड्यूलो 2 ^ एन का निर्माण करती हैं, जहां n से अहस्ताक्षरित संख्या की चौड़ाई है। अस्वाभाविक संख्या केवल दशमलव अंकों के बजाय बाइनरी अंक का प्रतिनिधित्व करने वाले पूर्णांक हैं। मॉड्यूलस सिस्टम में मानक संचालन करना अच्छी तरह समझा जाता है। मेरा मानना ​​है कि ओपी के उद्धरण इस तथ्य को दर्शाता है।

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