2011-03-16 14 views
5

के कारण पूर्णांक अहस्ताक्षरित से विभाजित मैं अहस्ताक्षरित int द्वारा पूर्णांक विभाजित करने के लिए कोशिश करते हैं और मैं अप्रत्याशित परिणाम प्राप्त:पूर्णांक रोलओवर

int b; 
unsigned int c; 
int res; 
float res_f; 

b = -25; 
c = 5; 

res = b/c; // res = 858993454 
res_f = b/c; // res_f = -5.000000 

एक ही काम करता है सिर्फ '+', के लिए ठीक '-' और '*', लेकिन '/' के लिए विफल रहता है। यह क्या है कि मुझे यहां याद आती है?

पीएस

यह विभिन्न कंपाइलरों पर परीक्षण किया गया था और नतीजा वही था।

+1

प्रोग्रामिंग भाषा क्या है? –

उत्तर

11

मान लिया जाये कि इस सी या इसी तरह के (जैसे उद्देश्य सी), परिवर्तन है:

res = b/c; 

रहे हैं:

res = b/(int)c; 

स्पष्टीकरण: ख int से unsigned int करने के लिए परिवर्तित किया जा रहा है, सी प्रकार रूपांतरण के अनुसार मिश्रित अभिव्यक्तियों के लिए नियम। प्रक्रिया में यह -25 से 0xFFFFFFE7 == 4294967271 से बहती है। फिर आपको unsigned int4294967271/5U = 858993454U का परिणाम मिलता है, जिसे तत्काल रूप से int पर परिवर्तित किया जा रहा है (इस चरण में कोई ओवरफ़्लो नहीं है, क्योंकि परिणाम दोनों हस्ताक्षरित और हस्ताक्षरित 32-बिट इनट्स की सीमा में है)।

वैसे, float परिणाम float (मुझे 858993472.0) की सटीक सीमाओं के भीतर समान होना चाहिए। मुझे आश्चर्य है कि आपको इस मामले में -5.0 मिलते हैं।

+0

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

+0

'सी' एक 'हस्ताक्षरित शॉर्ट' बनाना भी काम करता है अगर यह संदर्भ में अधिक समझ में आता है। – aaz

+1

आपके संपादन ने एक टाइपो को किसी अन्य टाइपो के साथ बदल दिया ... :-D –

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