2012-02-08 34 views
15

ओवरफ़्लोइंग unsigned int में जब मैं इसे बहता हूं तो क्या होगा? विशिष्ट होने के लिए, मैं दो unsigned int एस के साथ गुणा करना चाहता हूं: गुणा समाप्त होने के बाद unsigned int में क्या होगा?बिना हस्ताक्षर किए गए Int

unsigned int someint = 253473829*13482018273; 
+0

यह http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-c-c –

+1

का डुप्लिकेट प्रतीत होता है क्यों नहीं आज़माएं और देखें कि आपको क्या मिलता है? आम तौर पर, जब एक हस्ताक्षरित int बहती है, तो यह शून्य हो जाती है। तो 'UINT_MAX + 5' रोल हो जाता है और 4 हो जाता है। –

+0

यह अधिकतम uint मान और ओवरफ़्लो मान के मूल्य के बीच का अंतर होगा। आइए इसे सरल बनाएं। आइए मान लें कि अधिकतम यूआईटी 5 है। आप 2 * 4 जोड़ना चाहते हैं, इसलिए यह 8 के बजाय अंतिम मान 3 बनाता है। –

उत्तर

22

unsigned संख्या अतिप्रवाह नहीं कर सकते, लेकिन इसके बजाय सापेक्ष के गुणों का उपयोग कर के आसपास लपेटो।

उदाहरण के लिए, जब unsigned int 32 बिट्स है, तो परिणाम होगा: (a * b) mod 2^32


CharlesBailey के रूप में बताया, 253473829*13482018273 परिवर्तित किया जा रहा से पहले हस्ताक्षर किए गुणा उपयोग कर सकते हैं, और इसलिए आप गुणा से पहले unsigned के बारे में स्पष्ट होना चाहिए:

unsigned int someint = 253473829U * 13482018273U; 
+0

एक मानक का एक हिस्सा है? –

+2

@Zhenya हाँ, सी और सी ++ दोनों में। – Pubby

+0

@Zhenya - क्या इससे कोई फर्क पड़ता है? जवाब 100% सही है। यह UINT_MAX + 5 कहने का एक और तकनीकी तरीका है 4. यह संभवतः .NET भाषाओं और जावा दोनों में सत्य रहेगा। कम से कम .NET NaN के मामले में डबल की तरह सीमित है जहां मूल्य (अधिकांश समय) बिल्कुल प्रदर्शित नहीं होता है। –

5

अहस्ताक्षरित पूर्णांक अतिप्रवाह, अपने हस्ताक्षर किए समकक्ष, प्रदर्शन के विपरीत अच्छी तरह से परिभाषित व्यवहार।

मूल्य मूल रूप से "लपेटें" के आसपास। यह सुरक्षित और आमतौर पर गिनती, या हैशिंग/मॉड फ़ंक्शंस के लिए उपयोग किया जाता है।

+3

असाइन नहीं किया गया –

+1

मेरा मतलब यह था कि कुछ इसी तरह से संबंधित इसे समझाने की तुलना करने के लिए तुलना करें। मैंने बाद में थोड़ा सा लपेटकर मेरे बयान को अर्हता प्राप्त की। आह तकनीकीताओं। – evandrix

-3

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

+0

** बिना हस्ताक्षर ** ओवरफ्लो संकलक पर निर्भर नहीं है, यह रैप-आस-पास अर्थशास्त्र के मानकीकृत है। यह केवल ** हस्ताक्षरित ** अतिप्रवाह है जो अपरिभाषित मानों की ओर जाता है, और इस प्रकार संकलक पर निर्भर हो सकता है। – cmaster