2013-08-28 6 views
5
byte a = 1; 
byte b = 1; 
byte c = a + b; 

फेंकता त्रुटि: परिशुद्धता की संभावित हानिजावा भाषा नियमों या जेवीएम की वजह से बाइट कनवर्ट्स int में जोड़ना है?

byte subt = a_s - a_b; 
       ^
    required: byte 
    found: int 

इस व्यवहार JVM या उसके जावा भाषा में परिभाषित किया गया के साथ कुछ किया है।

संपादित करें: और यदि जावा भाषा में परिभाषित किया गया है तो क्या यह jvm को ध्यान में रखने के कारण है?

मतलब जावा byte डेटाप्रकार तो क्यों operation on byte परिणाम int

+0

बाइट c = ए + बी; त्रुटि में परिणाम ... बी + = ए; संकलित सफलतापूर्वक। क्यूं कर ? –

उत्तर

11

if java supports byte datatype then why operation on byte results int

क्योंकि कैसे जावा वर्चुअल मशीन डिज़ाइन किया गया है कि। बाइट प्रकार पर ऑपरेशन करने के लिए कोई निर्देश सेट नहीं है। इसके बजाय int प्रकार के लिए निर्देश सेट boolean, byte, char, और short प्रकारों पर ऑपरेशन के लिए उपयोग किया जाता है।

JVM Spec - Section 2.11.1 से

:

A compiler encodes loads of literal values of types byte and short using Java Virtual Machine instructions that sign-extend those values to values of type int at compile-time or run-time. Loads of literal values of types boolean and char are encoded using instructions that zero-extend the literal to a value of type int at compile-time or run-time. [..]. Thus, most operations on values of actual types boolean , byte , char , and short are correctly performed by instructions operating on values of computational type int .

इस के पीछे कारण भी है कि खंड में निर्दिष्ट किया जाता है:

Given the Java Virtual Machine's one-byte opcode size, encoding types into opcodes places pressure on the design of its instruction set. If each typed instruction supported all of the Java Virtual Machine's run-time data types, there would be more instructions than could be represented in a byte . [...] Separate instructions can be used to convert between unsupported and supported data types as necessary.

क्या सभी निर्देश सेट विभिन्न प्रकार के लिए उपलब्ध हैं पर जानकारी के लिए आप के माध्यम से जा सकते हैं उस खंड में तालिका।

+0

+1 जब JIT कोड को देशी कोड में अनुकूलित करता है, तो यह किसी भी प्रकार का उपयोग कर सकता है। यह एक 'int' प्रकार नहीं होना चाहिए। –

+1

जावा अभी भी उन्हें 'int' में परिवर्तित करने में सक्षम नहीं होगा, ऑपरेशन करेगा, और उन्हें वापस' बाइट 'में परिवर्तित कर देगा? जेएलएस विनिर्देश अधिक लागू लगता है, हालांकि यह जेएलएस के उस हिस्से के पीछे तर्क की व्याख्या कर सकता है। – Dukeling

+0

@PeterLawrey क्या वह मूल कोड जावा से संबंधित होगा? मेरा मतलब है कि एक अलग भाषा हो सकती है। क्या मैं सही हू? जेआईटी अनुकूलन के बारे में बहुत कम विचार। –

0

हाँ, यह भाषा कल्पना है समर्थन करता है तो।

अतिरिक्त (+) ऑपरेटर। जबकि जोड़ने, 'a'int प्रकार, बी के साथ-साथ int टाइप करने के लिए परिवर्तित होता है (अंतर्निहित रूप से रहता है)। इसलिए result स्पष्ट रूप से int प्रकार का है।

- ऑपरेटर के लिए भी।

+0

यह भाषा का नमूना है, लेकिन क्या आप वाकई सही सेक्शन उद्धृत कर रहे हैं? – Thilo

+0

@ थिलो हां.तुम सही हो। Dukelinkg सही ढंग से जुड़ा हुआ है :) –

5

JLS 5.6.2: Binary Numeric Promotion यह शामिल हैं:

Widening primitive conversion (§5.1.2) is applied to convert either or both operands as specified by the following rules:

  • If either operand is of type double , the other is converted to double .

  • Otherwise, if either operand is of type float , the other is converted to float .

  • Otherwise, if either operand is of type long , the other is converted to long .

  • Otherwise, both operands are converted to type int .

10

संकलक सही काम कर रही है:

वहाँ भी JVM कम्प्यूटेशनल प्रकार के वास्तविक प्रकार की मैपिंग को निर्दिष्ट एक टेबल है। क्योंकि (ए + बी) अधिकतम मूल्य से परे जा सकता है जिसे बाइट वेरिएबल में रखा जा सकता है। यदि आप कंपाइलर को बताते हैं, तो बी मान 'अंतिम' कीवर्ड का उपयोग करके नहीं बदलते हैं, जो अब शिकायत नहीं करेगा।

final byte a = 1; 
final byte b = 1; 
byte c = a + b; 
+0

यह वास्तव में वास्तव में दिलचस्प है! बहुत बहुत धन्यवाद –

+0

सरलीकृत उत्तर के लिए धन्यवाद। –

+0

बाइट सी = ए + बी; त्रुटि में परिणाम ... बी + = ए; संकलित सफलतापूर्वक। क्यूं कर ? –

0

किसी भी ऑपरेंड परिणाम इस फार्म मैक्स (पूर्णांक, operand1 प्रकार, operand2 प्रकार, ... operandN प्रकार) पूर्व में संग्रहित है पर अंकगणितीय आपरेशनों करते समय: तो byte a=10; byte b=20; byte c=a+b;

एक + बी का परिणाम MAX (int, operand1 प्रकार, operand2 प्रकार, के रूप में संग्रहीत किया जाएगा ...operandN प्रकार) इस मामले में MAX (int, बाइट, बाइट) अधिकतम मान int है जो अधिकतम है इसलिए सी में int मान होगा लेकिन सी को बाइट के रूप में घोषित किया गया है, और हम int (big) value को स्टोर नहीं कर सकते बाइट (छोटे) में। यह प्रत्येक अंकगणितीय ऑपरेटर के लिए लागू होता है।

है यही कारण है कि त्रुटि का कहना है त्रुटि: असंगत प्रकार: पूर्णांक से संभव हानिपूर्ण रूपांतरण बाइट के लिए

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