2010-06-19 17 views
11

मैं गूगल पर कुछ खोज किया है, लेकिन मुझे लगता है मैं क्या देख रहा हूँ लगता है नहीं कर पा रहे। मैं जावा में अंकगणितीय कार्यों के तरीके पर कुछ विस्तृत जानकारी खोजने की कोशिश कर रहा हूं। उदाहरण के लिए, यदि आप एक साथ दो लम्बे जोड़ते हैं तो क्या यह एक ही अतिरिक्त ऑपरेटर का उपयोग कर रहा है जिसका उपयोग दो इंट्स को एक साथ जोड़ते समय किया जाता है? इसके अलावा, क्या हुड के नीचे चल रहा है आप देशांतर और ints गणित भाव में इस तरह मिश्रण जब:जावा गणित पूर्णांक बनाम लंबे

long result; 
long operand a = 1; 
int operand b = 999999999; 

result = a + b; 

किसी को भी प्रासंगिक लेख है कि भयानक होगा करने के लिए इस या लिंक पोस्ट पर कुछ प्रकाश डाला सकता है। धन्यवाद!

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

+2

यह एक मंच नहीं है, यह उन लोगों के लिए वास्तव में पारदर्शी नहीं है जिन्होंने आपके प्रश्न का उत्तर दिया है कि आपके पास अनुवर्ती है। यद्यपि आपके संपादन के लिए: जावा आपको एक चर के लिए एक ऑपरेशन के परिणाम को आवंटित करने की अनुमति नहीं देगा यदि चर एक प्राचीन प्रकार का "विस्तृत" नहीं है जो इसे पकड़ने के लिए पर्याप्त है।अन्यथा बताए गए, आप int को विशेष रूप से कास्टिंग किए बिना int में "0L + 1" का परिणाम असाइन नहीं कर सकते हैं। –

+0

आह ठीक है, यह समझ में आता है। अनुवर्ती कार्रवाई के लिए धन्यवाद। – BordrGuy108

+0

यह पूरी तरह से सुरक्षित नहीं है क्योंकि कई परिचालनों में अंडरफ्लो या ओवरफ़्लो हो सकता है। Long.MAX_VALUE + 1 आज़माएं, हालांकि यदि आप सबसे व्यापक प्रकार को असाइन करते हैं तो यह हमेशा संकलित होगा। –

उत्तर

15

जब मिश्रण प्रकार int को स्वचालित रूप से लंबे समय तक बढ़ाया जाता है और फिर परिणाम उत्पन्न करने के लिए दो लम्बे जोड़े जाते हैं। java language spec में विभिन्न प्राइमेटिव प्रकार वाले संचालन के लिए अच्छे उदाहरण हैं। संक्षेप में, पूर्णांक, लंबे, नाव, या डबल

  • int करने के लिए कम, लंबे, नाव, या करने के लिए

    • बाइट:

      विशेष रूप से, इन प्रकार के एक डाली की आवश्यकता के बिना करने के लिए चौड़ा प्रत्येक आदिम इच्छा कर रहे हैं डबल

    • चार int करने के लिए, लंबे, नाव, या लंबे, नाव करने के लिए डबल
    • पूर्णांक, या करने के लिए डबल
    • लंबे फ्लोट करने के लिए या डबल
    • नाव डबल
  • +0

    मुझे लगता है कि यह टूटी हुई लिंक को ठीक करेगा: http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html#5.6 – Chris

    7

    देखें: Conversions and promotions

    कि के अनुसार, अपने intlong के लिए प्रोत्साहित किया जाता है और फिर मूल्यांकन किया जाता है।

    उदाहरण के लिए, int + double और शेष प्राइमेटिव के साथ होता है। अर्थात।

    System.out(1 + 2.0);// prints 3.0 a double 
    

    अलावा ऑपरेटर के लिए जैसा कि मैंने काफी यह एक ही है, लेकिन मैं इसके बारे में किसी भी संदर्भ नहीं है।

    कंपाइलर के स्रोत के लिए एक त्वरित दृश्य से पता चलता है कि वे अलग हैं।

    पूर्णांक इसके लिए

    अर्थात् iadd और लंबे समय से इसके लिए ladd:

    इस नमूना कोड देखें:

    $javap -c Addition 
    Compiled from "Addition.java" 
    public class Addition extends java.lang.Object{ 
    public Addition(); 
        Code: 
        0: aload_0 
        1: invokespecial #1; //Method java/lang/Object."<init>":()V 
        4: return 
    
    public static void main(java.lang.String[]); 
        Code: 
        0: aload_0 
        1: iconst_0 
        2: aaload 
        3: invokestatic #2; //Method java/lang/Integer.parseInt:(Ljava/lang/String;)I 
        6: istore_1 
        7: aload_0 
        8: iconst_0 
        9: aaload 
        10: invokestatic #3; //Method java/lang/Long.parseLong:(Ljava/lang/String;)J 
        13: lstore_2 
        14: iload_1 
        15: iload_1 
        16: iadd 
        17: istore 4 
        19: iload_1 
        20: i2l 
        21: lload_2 
        22: ladd 
        23: lstore 5 
        25: return 
    
    } 
    

    पंक्ति को देखें: जब उत्पन्न बाइट कोड संकलित

    $cat Addition.java 
    public class Addition { 
        public static void main(String [] args) { 
         int a = Integer.parseInt(args[0]); 
         long b = Long.parseLong(args[0]); 
         // int addition 
         int c = a + a; 
         // long addition 
         long d = a + b; 
        } 
    } 
    $javac Addition.java 
    $ 
    

    यह है 16 यह कहता है: iadd (int अतिरिक्त के लिए) जबकि लाइन 22 कहती है 012 (लंबी वर्धन के लिए)

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

    हाँ, और यह भी "सुरक्षित" छोटे आकार के साथ गणित प्रदर्शन करने के लिए है, इस अर्थ में, वे इस कार्यक्रम नहीं टूटते, तो आप सिर्फ जानकारी खो देते हैं।

    उदाहरण के लिए, यह देखने के लिए कि क्या होता है Integer.MAX_VALUE को Integer.MAX_VALUE जोड़ने का प्रयास करें या int x = (int) (Long.MAX_VALUE - 1);

    3
    इसके अलावा

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

    यह निर्भर करता है कि आपका सुरक्षित मतलब क्या है। यह निश्चित रूप से अतिप्रवाह की संभावना पर विचार करने की आवश्यकता से बच नहीं पाएगा।

    2
    int a=5; 
    long b=10; 
    a+=b; 
    System.out.println(a); 
    

    पर देखने के मुख्य अंतर यह है a = a + b साथ, वहाँ कोई typecasting चल रहा है, और इसलिए संकलक typecasting नहीं करने के लिए आप पर गुस्सा हो जाता है कि है। लेकिन a += b के साथ, यह वास्तव में क्या कर रहा है टाइपिंग b से aa के साथ संगत टाइप प्रकार है।

    +0

    तो यह 'long' से' अदृश्य डाउनकास्ट बना रहा है। int', संभावित रूप से जानकारी फेंक रहा है? बस 'java.io.ByteArrayInputStream # छोड़ें (लंबा)' में यह आया और एक डबल ले लिया। पहले कभी नहीं देखा। – nilskp

    1

    यह सरल उदाहरण जावा में अंकगणितीय परिचालनों के मामले में डेटा प्रकार रूपांतरण के बारे में संदेह को साफ़ कर सकता है।

    byte a = 1; 
        short b = 1; 
        System.out.println(a+b);      //Output = 2 
        Object o = a+b;        //Object becomes int 
        System.out.println(o.getClass().getName()); //Output = java.lang.Integer 
    
        int c = 1; 
        System.out.println(a+b+c);     //Output = 3 
        o = a+b+c;         //Object becomes int 
        System.out.println(o.getClass().getName()); //Output = java.lang.Integer 
    
        long d = 1l; 
        System.out.println(a+b+c+d);     //Output = 4 
        o = a+b+c+d;         //Object becomes long 
        System.out.println(o.getClass().getName()); //Output = java.lang.Long 
    
        float e = 1.0f; 
        System.out.println(a+b+c+d+e);    //Output = 5.0 
        o = a+b+c+d+e;        //Object becomes float 
        System.out.println(o.getClass().getName()); //Output = java.lang.Float 
    
        double f = 1.0; 
        System.out.println(a+b+c+d+e+f);    //Output = 6.0 
        o = a+b+c+d+e+f;        //Object becomes double 
        System.out.println(o.getClass().getName()); //Output = java.lang.Double 
    

    के बाद जावा में सीमा के अनुसार डेटा प्रकार के आदेश है:

    byte<short<int<long<float<double 
    

    यह जिस क्रम में चौड़ा करने क्या होगा है।

    नोट: फ्लोट की लंबाई अधिक से अधिक है, लेकिन इसका आकार छोटा है।

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