गो

2015-11-10 6 views
8

में हस्ताक्षरित int ओवरफ़्लो का पता लगाएं, मैं एक लिस्प बना रहा हूं, और मैं चाहता हूं कि 32 बिट पूर्णांक स्वचालित रूप से 64 बिट पूर्णांक पर स्विच हो जाएं यदि गणना गणना उन्हें अन्यथा बहती है। और इसी तरह, 64 बिट ओवरफ्लो के लिए, मनमाने ढंग से आकार वाले पूर्णांक पर स्विच करें।गो

मेरी समस्या यह है कि मुझे नहीं पता कि एक पूर्णांक ओवरफ़्लो का पता लगाने के लिए "सही" तरीका क्या है।

a, b := 2147483647, 2147483647 
c := a + b 

मैं कुशलता से जांच कैसे कर सकता हूं कि सी अतिप्रवाह है या नहीं?

मैंने गणना करने के लिए हमेशा 64 बिट मानों को परिवर्तित करने पर विचार किया है, फिर संभव होने पर बाद में फिर से आकार बदलना, लेकिन यह मूलभूत अंकगणितीय के रूप में भाषा के लिए आदिम और मूल के रूप में महंगा और स्मृति अपर्याप्त लगता है।

+0

मैं मुक्केबाजी संदेह है कि आपका सबसे अच्छा शर्त है। तेजी से अतिरिक्त रखने के लिए भाषा में कोई तंत्र नहीं है। – captncraig

+1

मुझे लगता है कि अधिकांश आधुनिक प्रणालियों में अतिरिक्त 4 बाइट नगण्य के पास है, ज्यादातर स्थितियों में 64 बिट बनाम 32 बिट पूर्णांक (बड़े सरणी के लिए अपवाद) इत्यादि का उपयोग करने के लिए। विधानसभा के बिना ओवरफ्लो के रनटाइम स्वचालित पहचान के लिए, और यदि आपका पर्यावरण अपवाद नहीं फेंकता है तो आप पकड़ सकते हैं, यह मामूली नहीं है। IMHO। – Alderin

+0

केवल गणना के लिए 64-बिट * में कनवर्ट करना * अनिवार्य रूप से कोई स्मृति प्रभाव नहीं है, क्योंकि आप एक समय में केवल आकार के मूल्यों की निरंतर संख्या रखते हैं। उदाहरण के लिए, ओपनजेडीके ['Math.multiplyExact (int, int) '] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java /lang/Math.java#864) करता है। – user2357112

उत्तर

5

उदाहरण के लिए, इसके अलावा के लिए 32-बिट पूर्णांक अतिप्रवाह पता लगाने के लिए,

package main 

import (
    "errors" 
    "fmt" 
    "math" 
) 

var ErrOverflow = errors.New("integer overflow") 

func Add32(left, right int32) (int32, error) { 
    if right > 0 { 
     if left > math.MaxInt32-right { 
      return 0, ErrOverflow 
     } 
    } else { 
     if left < math.MinInt32-right { 
      return 0, ErrOverflow 
     } 
    } 
    return left + right, nil 
} 
func main() { 
    var a, b int32 = 2147483327, 2147483327 
    c, err := Add32(a, b) 
    if err != nil { 
     // handle overflow 
     fmt.Println(err, a, b, c) 
    } 
} 

आउटपुट:

integer overflow 2147483327 2147483327 0 
+0

धन्यवाद! मुझे लगता है कि मेरे पास एक छोटा समाधान हो सकता है, लेकिन यह सुनिश्चित नहीं है कि किनारे के मामले हैं जहां यह काम नहीं करता है: '((सी <ए)! = (बी <0)) ', जहां' c: = a + b' । – d11wtq

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