मैं बस सोच रहा था कि कैसे विनाशकारी पूर्णांक अतिप्रवाह वास्तव में है। 32 बिट प्लेटफार्मों परसी ++ में पूर्णांक कितना विनाशकारी है?
#include <iostream>
int main()
{
int a = 46341;
int b = a * a;
std::cout << "hello world\n";
}
a * a
के बाद से अतिप्रवाह, और पूर्णांक अतिप्रवाह अपरिभाषित व्यवहार से चलाता है, मैं सभी कि hello world
वास्तव में मेरे स्क्रीन पर दिखाई देगा पर किसी भी गारंटी देता है की क्या ज़रूरत है: निम्न उदाहरण कार्यक्रम ले लो?
मैं अपने सवाल से "पर हस्ताक्षर किए" भाग निम्न मानक उद्धरण के आधार पर निकाल:
(§5/5 सी ++ 03, §5/4 सी ++ 11) हैं अभिव्यक्ति के मूल्यांकन के दौरान, परिणाम गणितीय रूप से परिभाषित नहीं है या इसके प्रकार के लिए प्रतिनिधित्व योग्य मूल्यों की सीमा में नहीं है, व्यवहार अपरिभाषित है।
(§3.9.1/4)
unsigned
घोषित बिना हस्ताक्षर किए गए पूर्णांक, अंकगणित मॉड्यूलो 2^एन के नियमों का पालन करेंगे जहां एन पूर्णांक के उस विशेष आकार के मान प्रतिनिधित्व में बिट्स की संख्या है। इसका तात्पर्य है कि हस्ताक्षरित अंकगणित ओवरफ्लो नहीं होता है जिसके परिणामस्वरूप परिणामस्वरूप हस्ताक्षरित पूर्णांक प्रकार द्वारा प्रतिनिधित्व नहीं किया जा सकता है, जो मॉड्यूल को कम करता है जो कि सबसे बड़ा मान से अधिक होता है जिसे परिणामस्वरूप हस्ताक्षरित पूर्णांक प्रकार द्वारा दर्शाया जा सकता है।
मैं कभी नहीं देखा है सी में एक अतिप्रवाह ++ एक मुद्दा होता है। संख्या बस खुशी से लपेट जाएगी और प्रोसेसर पर ओवरफ्लो ध्वज सेट करेगा। – Brain2000
@ ब्रेन 2000 वे ज्यादातर अनुकूलन के मुद्दों का कारण बनते हैं। जैसे कि '(ए + 1> ए)' ओवरफ्लो के बावजूद हमेशा सत्य होता है। – Pubby
[जीसीसी विफलता का संभावित डुप्लिकेट? या अपरिभाषित व्यवहार?] (Http://stackoverflow.com/questions/7682477/gcc-fail-or-undefined-behavior) – Xeo