में हस्ताक्षरित int ओवरफ़्लो का पता लगाएं, मैं एक लिस्प बना रहा हूं, और मैं चाहता हूं कि 32 बिट पूर्णांक स्वचालित रूप से 64 बिट पूर्णांक पर स्विच हो जाएं यदि गणना गणना उन्हें अन्यथा बहती है। और इसी तरह, 64 बिट ओवरफ्लो के लिए, मनमाने ढंग से आकार वाले पूर्णांक पर स्विच करें।गो
मेरी समस्या यह है कि मुझे नहीं पता कि एक पूर्णांक ओवरफ़्लो का पता लगाने के लिए "सही" तरीका क्या है।
a, b := 2147483647, 2147483647
c := a + b
मैं कुशलता से जांच कैसे कर सकता हूं कि सी अतिप्रवाह है या नहीं?
मैंने गणना करने के लिए हमेशा 64 बिट मानों को परिवर्तित करने पर विचार किया है, फिर संभव होने पर बाद में फिर से आकार बदलना, लेकिन यह मूलभूत अंकगणितीय के रूप में भाषा के लिए आदिम और मूल के रूप में महंगा और स्मृति अपर्याप्त लगता है।
मैं मुक्केबाजी संदेह है कि आपका सबसे अच्छा शर्त है। तेजी से अतिरिक्त रखने के लिए भाषा में कोई तंत्र नहीं है। – captncraig
मुझे लगता है कि अधिकांश आधुनिक प्रणालियों में अतिरिक्त 4 बाइट नगण्य के पास है, ज्यादातर स्थितियों में 64 बिट बनाम 32 बिट पूर्णांक (बड़े सरणी के लिए अपवाद) इत्यादि का उपयोग करने के लिए। विधानसभा के बिना ओवरफ्लो के रनटाइम स्वचालित पहचान के लिए, और यदि आपका पर्यावरण अपवाद नहीं फेंकता है तो आप पकड़ सकते हैं, यह मामूली नहीं है। IMHO। – Alderin
केवल गणना के लिए 64-बिट * में कनवर्ट करना * अनिवार्य रूप से कोई स्मृति प्रभाव नहीं है, क्योंकि आप एक समय में केवल आकार के मूल्यों की निरंतर संख्या रखते हैं। उदाहरण के लिए, ओपनजेडीके ['Math.multiplyExact (int, int) '] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java /lang/Math.java#864) करता है। – user2357112