java - जावा में, दो वर्णों को एक int या char के अतिरिक्त का परिणाम है?




primitive addition (6)

आप char बारे में निम्नलिखित अभिव्यक्ति सीखना चाह सकते हैं।

char c='A';
int i=c+1;

System.out.println("i = "+i);

यह जावा में पूरी तरह से मान्य है और c+1 के चरित्र (यूनिकोड) के इसी मूल्य को 66 देता है।

String temp="";
temp+=c;
System.out.println("temp = "+temp);

यह जावा में बहुत मान्य है और स्ट्रिंग प्रकार परिवर्तनीय temp स्वचालित रूप से प्रकार के char को स्वीकार करता है और कंसोल पर temp=A उत्पन्न करता है।

निम्नलिखित सभी कथन जावा में भी मान्य हैं!

Integer intType=new Integer(c);
System.out.println("intType = "+intType);

Double  doubleType=new Double(c);
System.out.println("doubleType = "+doubleType);

Float floatType=new Float(c);
System.out.println("floatType = "+floatType);

BigDecimal decimalType=new BigDecimal(c);
System.out.println("decimalType = "+decimalType);

Long longType=new Long(c);
System.out.println("longType = "+longType);

यद्यपि c एक प्रकार का char , लेकिन इसे संबंधित रचनाकारों में कोई त्रुटि नहीं दी जा सकती है और उपर्युक्त सभी कथन वैध कथन के रूप में माना जाता है। वे क्रमशः निम्नलिखित आउटपुट का उत्पादन करते हैं।

intType = 65
doubleType = 65.0
floatType = 65.0
decimalType = 65
longType =65

char एक आदित्मक संख्यात्मक अभिन्न प्रकार है और यह इन जानवरों के सभी नियमों के अधीन है जिसमें रूपांतरण और प्रचार शामिल हैं। आप इस पर पढ़ना चाहेंगे, और जेएलएस इसके लिए सबसे अच्छे स्रोतों में से एक है: रूपांतरण और प्रचार । विशेष रूप से, "5.1.2 आदिम रूपांतरण को चौड़ा करना" पर संक्षिप्त बिट पढ़ें।

'a' + 'b' जोड़ते समय यह 1 9 5 का उत्पादन करता है। आउटपुट डेटाटाइप char या int ?


जबकि आपके पास पहले से ही सही उत्तर है (जेएलएस में संदर्भित), यहां यह सत्यापित करने के लिए कोड का एक छोटा सा कोड है कि दो char जोड़ते समय आपको एक int प्राप्त होता है।

public class CharAdditionTest
{
    public static void main(String args[])
    {
        char a = 'a';
        char b = 'b';

        Object obj = a + b;
        System.out.println(obj.getClass().getName());
    }
}

आउटपुट है

java.lang.Integer


जावा वर्ण, शॉर्ट्स, या बाइट जोड़ने का परिणाम एक int है :

बाइनरी न्यूमेरिक प्रमोशन पर जावा भाषा विशिष्टता :

  • यदि किसी भी ऑपरेंड संदर्भ प्रकार का है, तो अनबॉक्सिंग रूपांतरण (§5.1.8) किया जाता है। फिर:
  • यदि ऑपरेंड डबल टाइप प्रकार है, तो दूसरा डबल में परिवर्तित हो जाता है।
  • अन्यथा, अगर ऑपरेंड फ्लोट प्रकार का है, तो दूसरा फ्लोट में परिवर्तित हो जाता है।
  • अन्यथा, यदि या तो ऑपरेंड लंबे प्रकार का है, तो दूसरा लंबा हो जाता है।
  • अन्यथा, दोनों ऑपरेटरों को टाइप int में परिवर्तित कर दिया जाता है।

लेकिन ध्यान दें कि यह यौगिक असाइनमेंट ऑपरेटर (जैसे + =) के बारे में क्या कहता है :

बाइनरी ऑपरेशन का परिणाम बाएं हाथ के चर के प्रकार में परिवर्तित हो जाता है ... और रूपांतरण का परिणाम चर में संग्रहीत किया जाता है।

उदाहरण के लिए:

char x = 1, y = 2;
x = x + y; // compile error: "possible loss of precision (found int, required char)"
x = (char)(x + y); // explicit cast back to char; OK
x += y; // compound operation-assignment; also OK

एक तरह से आप परिणाम के प्रकार को सामान्य रूप से ढूंढ सकते हैं, इसे किसी ऑब्जेक्ट में डालना और यह पूछना कि यह कौन सी कक्षा है:

System.out.println(((Object)('a' + 'b')).getClass());
// outputs: class java.lang.Integer

यदि आप प्रदर्शन में रूचि रखते हैं, तो ध्यान दें कि जावा बाइटकोड में छोटे डेटा प्रकारों के साथ अंकगणित के लिए समर्पित निर्देश भी नहीं हैं। उदाहरण के लिए, जोड़ने के लिए, निर्देश iadd (ints के लिए), ladd (लंबे समय तक), fadd ( dadd लिए), dadd (युगल के लिए) हैं, और यही वह है। छोटे प्रकार के साथ x += y अनुकरण करने के लिए, कंपाइलर iadd का उपयोग iadd और फिर iadd ("int to char") जैसे निर्देशों का उपयोग करके int के ऊपरी बाइट्स को शून्य करेगा। यदि मूल सीपीयू ने 1-बाइट या 2-बाइट डेटा के लिए निर्देश समर्पित किए हैं, तो यह जावा वर्चुअल मशीन पर चलने के लिए अनुकूलित करने के लिए है।

यदि आप उन्हें संख्यात्मक प्रकार के रूप में व्याख्या करने के बजाय वर्णों को एक स्ट्रिंग के रूप में जोड़ना चाहते हैं, तो ऐसा करने के कई तरीके हैं। अभिव्यक्ति में एक खाली स्ट्रिंग जोड़ना सबसे आसान है, क्योंकि एक स्ट्रिंग में एक char और स्ट्रिंग परिणाम जोड़ना। इन सभी अभिव्यक्तियों का परिणाम स्ट्रिंग "ab" :

  • 'a' + "" + 'b'
  • "" + 'a' + 'b' (यह काम करता है क्योंकि "" + 'a' का मूल्यांकन पहले किया जाता है; यदि अंत में अंत में "195"
  • new String(new char[] { 'a', 'b' })
  • new StringBuilder().append('a').append('b').toString()
  • String.format("%c%c", 'a', 'b')

यद्यपि यहां कुछ अजीब बात है। निम्नलिखित संकलन:

char x;
x = 'a' + 'b';

लेकिन यह नहीं है:

char x;
x = 'a';
x = x + 'b';

ऐसा लगता है कि निम्नलिखित अभिव्यक्तियों द्वारा दोनों अभिव्यक्तियों ('ए' + 'बी' और एक्स + 'बी') पूर्णांक में परिणामस्वरूप होते हैं:

Object obj = 'a'+'b';
System.out.println(obj.getClass().getName());

char x = 'a';
Object obj2 = x+'b';
System.out.println(obj2.getClass().getName());

तो दूसरा मामला क्यों संकलित नहीं होगा? संयोग से, आप संपूर्ण अभिव्यक्ति को चार के रूप में कास्ट करके इसे ठीक कर सकते हैं:

x = (char)(x+'b');

यह जावा के अर्थशास्त्र में एक असंगतता की तरह प्रतीत होता है - किसी भी संदर्भ में किसी भी चार अभिव्यक्ति को दूसरे के साथ एक दूसरे के साथ बदलना चाहिए। क्या किसी को इसका एहसास करने का तरीका पता है?


char को Unicode मानों के रूप में दर्शाया जाता है और जहां यूनिकोड मानों का प्रतिनिधित्व \u बाद Hexadecimal मानों द्वारा किया जाता है।

int मूल्यों पर प्रचारित char मूल्यों पर कोई अंकगणितीय ऑपरेशन के रूप में, इसलिए 'a' + 'b' के परिणाम की गणना की जाती है

1.) Unicode Table का उपयोग कर संबंधित char पर Unicode मान लागू करें

2.) हेक्साडेसिमल को दशमलव रूपांतरण में लागू करें और फिर ऑपरेशन को Decimal मानों पर करें।

    char        Unicode      Decimal
     a           0061          97
     b           0062          98  +
                              195

Unicode To Decimal Converter

उदाहरण

0061

(0 * 16 3 ) + (0 * 16 2 ) + (6 * 16 1 ) + (1 * 16 0 )

(0 * 40 9 6) + (0 * 256) + (6 * 16) + (1 * 1)

0 + 0 + 9 6 + 1 = 9 7

0062

(0 * 16 3 ) + (0 * 16 2 ) + (6 * 16 1 ) + (2 * 16 0 )

(0 * 40 9 6) + (0 * 256) + (6 * 16) + (2 * 1)

0 + 0 + 9 6 + 2 = 98

इसलिए 97 + 98 = 195

उदाहरण 2

char        Unicode      Decimal
 Ջ           054b         1355
 À           00c0          192 
                      --------
                          1547    +
                          1163    -
                             7    /
                        260160    *
                            11    %

char और byte (और short ) पर बाइनरी अंकगणितीय परिचालन int -JLS 5.6.2 को बढ़ावा देता है।





addition