2009-04-08 10 views
7

को बताए अगर मैं सी में निम्न कोड निष्पादित करें:सी पूर्णांक अतिप्रवाह व्यवहार जब बड़े-चौड़ाई पूर्णांकों

#include <stdint.h> 

uint16_t a = 4000; 
uint16_t b = 8000; 

int32_t c = a - b; 

printf("%d", c); 

यह सही ढंग से परिणाम के रूप में प्रिंट '-4000'। हालांकि, मैं थोड़ा उलझन में हूं: दूसरे से एक बड़े हस्ताक्षरित पूर्णांक को घटाने पर अंकगणित अतिप्रवाह नहीं होना चाहिए? यहां क्या कास्टिंग नियम खेल रहे हैं? यह सवाल थोड़ा सा नोबिश लगता है, इसलिए किसी भी संदर्भ की सराहना की जाएगी।

उत्तर

5

मुद्दा वास्तव में कुछ जटिल है। अंकगणितीय अभिव्यक्तियों के संचालन विशिष्ट नियमों का उपयोग करके परिवर्तित किए जाते हैं जिन्हें आप Standard (C89) के अनुभाग 3.2.1.5 में देख सकते हैं। आपके मामले में, उत्तर इस बात पर निर्भर करता है कि uint16_t किस प्रकार है। यदि यह int से छोटा है, तो short int कहें, तो ऑपरेंड int में परिवर्तित हो जाते हैं और आपको -4000 मिलते हैं, लेकिन 16-बिट सिस्टम पर, uint16_tunsigned int हो सकता है और एक हस्ताक्षरित प्रकार में रूपांतरण स्वचालित रूप से नहीं होगा।

+0

मेरा संदर्भ पुराने मानक के लिए है। सी 99 के लिए tgamblin की प्रतिक्रिया देखें। हालांकि वे एक ही बात कहते हैं। – TrayMan

+0

3.2.1.5 डबल/फ्लोट/इंट/आदि रूपांतरणों के लिए है। वह अभिन्न (लंबे/int/char/short/etc) प्रचार की तलाश में है जो मानक के उस संस्करण के 3.2.1.1 में है। यह ऊपर से जुड़े नए मानक में 6.3.1.1 में है। – tgamblin

+0

वह 3.2.1.2 भी (हस्ताक्षरित/हस्ताक्षरित इनट्स) – tgamblin

1

दोनों ऑपरेटरों को घटाव के दौरान int32_t पर पदोन्नत किया जाता है। यदि परिणाम int32_t के अधिकतम मूल्य से बड़ा था तो आप ओवरफ़्लो देखेंगे।

3

संक्षिप्त उत्तर यह है कि इन सब को घटाव के दौरान int पर प्रचारित किया जाता है। लंबे उत्तर के लिए, C standard की धारा 6.3.1.1 देखें, जहां यह अंकगणितीय अभिव्यक्तियों में पूर्णांक प्रचार के बारे में बात करता है। मानक से प्रासंगिक भाषा:

एक int मूल प्रकार के सभी मूल्यों का प्रतिनिधित्व कर सकते हैं, मूल्य एक int में बदल जाती है, अन्यथा, यह unsigned int में परिवर्तित हो गया है। ये को पूर्णांक पदोन्नति कहा जाता है। अन्य सभी प्रकार पूर्णांक प्रचार द्वारा अपरिवर्तित हैं।

विवरण भी वहां हैं, लेकिन वे बहुत खराब हो जाते हैं।

0

वास्तव में, एक अतिप्रवाह है लेकिन सी आपको नहीं बताता है।

ओवरफ्लो एक मान को छोड़ देता है जो -4000 होता है जब हस्ताक्षरित पूर्णांक के रूप में व्याख्या की जाती है। यह 2 की पूरक मशीनों पर डिज़ाइन के रूप में काम करता है।

नतीजे के रूप में परिणाम की व्याख्या करने का प्रयास करें, और आप देखेंगे कि (u1-u2) कुछ प्रतीत होता है कि आप असंबद्ध संख्या का मूल्यांकन करते हैं जब u1 < u2।

संबंधित मुद्दे