क्यों "int i = 2147483647 + 1;" ठीक है, लेकिन "बाइट बी = 127 + 1;" क्या यह अनिवार्य नहीं है?


126

क्यों int i = 2147483647 + 1;ठीक है, लेकिन byte b = 127 + 1;अनिवार्य नहीं है?


16
मेरे पास एक वास्तविक संदेह भी है: byteडेटा प्रकार ऐसा दर्द क्यों है ?!
BoltClock

9
यह निश्चित रूप से एक डिज़ाइन की गलती है जिसे byteअहस्ताक्षरित के बजाय साइन किया गया है।
विवादास्पद

4
@BoltClock यह केवल एक दर्द है जब आप नहीं जानते कि इसे ठीक से कैसे उपयोग किया जाए। stackoverflow.com/questions/397867/…
स्टारबेल

2
@starblue, क्या कोई वास्तविक जीवन उदाहरण है जहां जावा बाइट प्रकार लागू है?
थोर्बोजर्न रेवन एंडरसन

यदि एक डेटा है जो बाइट के रूप में निर्दिष्ट है, तो byteस्पष्टता के लिए एक जावा का उपयोग करें , उदाहरण के लिए मापदंडों में। इस मामले में कि आप intमूल्यों को निर्दिष्ट नहीं कर सकते तथ्य यह भी कुछ कीड़े पकड़ लेंगे। या byteसरणियों में स्थान बचाने के लिए उपयोग करें। मैं byteएक एकल मूल्य के लिए उपयोग नहीं करूंगा जो सिर्फ एक बाइट में फिट होने के लिए होता है।
Starblue

जवाबों:


172

स्थिरांक का मूल्यांकन किलों के रूप में किया जाता है, इसलिए यह बहुत 2147483647 + 1ज़्यादा होता है और आपको एक नया इंट देता है, जो असाइन करने योग्य है int, जबकि 127 + 1इसका मूल्यांकन भी इसके intबराबर है 128, और यह करने के लिए उपलब्ध नहीं है byte


10
दरअसल, आज मैंने कुछ जावा पज़लर्स को पढ़ा , जिसमें एक पहेली भी शामिल है ... यहाँ देखें: javapuzzlers.com/java-puzzlers-sampler.pdf - पहेली 3
MByD

3
समस्या intद्विआधारी संख्यात्मक पदोन्नति के कारण प्रकार है , मान 127एक लाल हेरिंग है।
स्टारबेल

मैं अनंत सटीकता के साथ मूल्यांकन किए जाने वाले स्थिरांक पसंद करूंगा और साथ ही int i = 2147483647 + 1 पर एक त्रुटि दे सकता हूं;
एडुआर्डो

@MByD: जैसा कि आपने कहा " while 127 + 1 also evaluated as int equals to 128, and it is not assignable to byte.", क्या इसका मतलब यह है कि 50 + 1 का मूल्यांकन किया जाएगा byteऔर इसलिए इसके लिए उपयुक्त है byte?
भूषण

1
@ 10101010 - बिल्कुल नहीं। यह बाइट के लिए असाइन किया जाएगा, लेकिन पहले (मानक के अनुसार) इसका मूल्यांकन इंट के रूप में किया जाएगा।
5

35

127 का शाब्दिक प्रकार इंट का मान दर्शाता है। तो शाब्दिक है 1. इन दोनों का योग पूर्णांक 128 है। समस्या, दूसरे मामले में, यह है कि आप इसे टाइप बाइट के एक चर के लिए असाइन कर रहे हैं। इसका भावों के वास्तविक मूल्य से कोई लेना-देना नहीं है। यह जावा के साथ सहकारिता (*) का समर्थन नहीं करना है। आपको एक टाइपकास्ट जोड़ना होगा

byte b = (byte)(127 + 1);

और फिर यह संकलन करता है।

(*) कम से कम तरह के स्ट्रिंग-टू-पूर्णांक, फ्लोट-टू-टाइम, ... जावा का समर्थन नहीं करता है यदि वे एक अर्थ में, गैर-नुकसान (जावा इस "चौड़ीकरण" कहते हैं)।

और नहीं, शब्द "जबरदस्ती" को सही करने की आवश्यकता नहीं थी। यह बहुत जानबूझकर और उस पर सही ढंग से चुना गया था। निकटतम स्रोत से हाथ तक (विकिपीडिया): "अधिकांश भाषाओं में, शब्द जबरन का उपयोग निहित रूपांतरण को दर्शाने के लिए किया जाता है , या तो संकलन के दौरान या रन टाइम के दौरान।" और "कंप्यूटर विज्ञान में, टाइप रूपांतरण, टाइपकास्टिंग और जबरदस्ती के अलग - अलग तरीके हैं, संक्षेप में या स्पष्ट रूप से, एक डेटा प्रकार की इकाई को दूसरे में बदलना।"


आपका कोड उदाहरण संभवतः बाइट बी = (बाइट) 127 + 1 होना चाहिए; जो '1 को अधिकतम बाइट मान में जोड़ें' है, आपका उदाहरण सिर्फ इंट की कीमत को 128 के बाइट के मूल्य में बदल देता है।
NKCSS

6
@ एनकेसीएसएस - मुझे नहीं लगता कि आप सही कह रहे हैं, यह - (byte)(127 + 1)एक बाइट को 128 (पूर्णांक), जबकि यह (byte)127 + 1127 को बाइट में डाल देता है, लेकिन फिर एक इंट में, क्योंकि यह 1 (इंट) में जोड़ा गया है और आप 128 (int) और त्रुटि रहती है।
एमबीयूडी

6

@MByD के लिए एक सबूत के रूप में:

निम्नलिखित कोड संकलित करता है:

byte c = (byte)(127 + 1);

क्योंकि हालांकि अभिव्यक्ति (127 + 1)अंतरंग है और दायरे से परे है byte, जिसके परिणामस्वरूप परिणाम डाला जाता है byte। यह अभिव्यक्ति पैदा करता है -128


3

JLS3 # 5.2 असाइनमेंट रूपांतरण

(चर = अभिव्यक्ति)

इसके अलावा, यदि अभिव्यक्ति प्रकार बाइट, लघु, चार या इंट का एक स्थिर अभिव्यक्ति (815.28) है:

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


इस खंड के बिना, हम नहीं लिख पाएंगे

byte x = 0;
char c = 0;

लेकिन क्या हमें ऐसा करने में सक्षम होना चाहिए? मुझे ऐसा नहीं लगता। आदिम लोगों के बीच रूपांतरण में काफी कुछ जादू चल रहा है, बहुत सावधान रहना चाहिए। मैं लिखने के लिए अपने रास्ते से हट जाता

byte x = (byte)0;

सवाल के रूप में हम करने में सक्षम होना चाहिए ... मैं वास्तव में कुछ भी गलत नहीं दिख byte x = 0रहा है, लेकिन फिर, मैं एक सी प्रोग्रामर हूँ।
ग्रैडी प्लेयर

मैं शायद चार सी = 0 के खिलाफ एक तर्क देख सकता हूं, लेकिन बाइट एक्स = 0 गलत क्यों है?
माइकल बर्ज

यह अप्रशिक्षित आंखों के लिए भ्रामक है, यह सोचकर कि वे एक बाइट चर को 0 बाइट दे रहे हैं। इस उदाहरण में बहुत नुकसान नहीं है, लेकिन सामान्य तौर पर, बाइट / शॉर्ट / चार पर काम करना निहितार्थ रूपांतरण के कारण बहुत भ्रमित हो सकता है। वे लोग जितना सोचते हैं उससे कहीं अधिक जटिल होते हैं। मैं अपने कोड में यथासंभव स्पष्टता चाहता हूं, कुछ प्रमुख स्ट्रोक को बचाने के लिए किसी भी अनिश्चितता का परिचय नहीं देता हूं।
अपरिवर्तनीय

क्या एक समान नियम तब लागू होता है जब संकीर्ण आदिम रूपांतरण लंबे समय से इंट से होता है, जैसे int i = 1 + 0L? सिर्फ इसलिए पूछ रहा हूं क्योंकि आपका उद्धृत पाठ स्पष्ट रूप से उस मामले को छोड़ देता है।
एरविन स्माउट

@ इरविन नहीं, int i=0Lअवैध है।
17
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.