जावा का एल नंबर (लंबा) विनिर्देश


95

ऐसा प्रतीत होता है कि जब आप जावा में एक संख्या में टाइप करते हैं, तो कंपाइलर स्वचालित रूप से इसे एक पूर्णांक के रूप में पढ़ता है, यही कारण है कि जब आप टाइप करते हैं (लंबे) 6000000000(पूर्णांक की सीमा में नहीं) तो यह शिकायत करेगा कि 6000000000पूर्णांक नहीं है। इसे ठीक करने के लिए, मुझे निर्दिष्ट करना होगा 6000000000L। मुझे इस विनिर्देश के बारे में पता चला।

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

जवाबों:


174

long(जैसे 39832L), float(जैसे 2.4f) और double(जैसे -7.832d) के लिए विशिष्ट प्रत्यय हैं ।

यदि कोई प्रत्यय नहीं है, और यह एक अभिन्न प्रकार (जैसे 5623) है, तो यह माना जाता है कि ए int। यदि यह एक अभिन्न प्रकार (जैसे 3.14159) नहीं है, तो यह माना जाता है कि यह एक है double

अन्य सभी मामलों में ( byte, short, char), आप कलाकारों की जरूरत के रूप में वहाँ कोई विशेष प्रत्यय है।

जावा कल्पना ऊपरी और निचले दोनों प्रकार के प्रत्ययों की अनुमति देती है, लेकिन ऊपरी मामले के संस्करण longको प्राथमिकता दी जाती है, क्योंकि ऊपरी मामले Lको कम मामले की 1तुलना में अंक के साथ भ्रमित करना आसान नहीं है l

देखें JLS खंड 3.10 रक्तमय विवरण (की परिभाषा को देखने के लिए IntegerTypeSuffix)।


9
देर से प्रवेश: अस्पष्टता के संभावित स्रोतों को हटाने हमेशा अच्छा है, और मैं असहमत नहीं है ... लेकिन मैं अगर तुम अपने आप को भ्रमित कर पाते हैं का मानना है 1के साथ lऔर 0साथ O(इतने पर और), आपके प्राथमिकता फ़ॉन्ट सही स्थापित करने के लिए है (यदि आप कर सकते हैं ), फिर यह सुनिश्चित करने के बारे में चिंता करें कि आप Shift कुंजी को याद नहीं करते हैं।
davidcsb

@SimonNickerson मैं प्रत्यय के बारे में एक सवाल है ... अगर मैं एक लंबे या दोहरे चर की तरह घोषित करता हूं : long _lo = 30;और 30Lइसका मतलब यह नहीं है कि मेरा चर फ्लोट में बदल जाएगा ? या _lo = _lo + 2.77उस मामले _loमें फ्लोट में डाल दिया जाएगा, हालांकि इसे लंबे समय तक
luigi7up

नहीं, यहां झांकियां शामिल नहीं हैं। पहले मामले में, 30एक intस्वचालित रूप से एक व्यापक रूपांतरण के माध्यम से परिवर्तित हो जाता है long। दूसरे मामले में, आपका बयान अवैध है। आपको स्पष्ट रूप से दाएं हाथ को लंबे समय तक डालना होगा, जैसे_lo = (long) (_lo + 2.77)
साइमन निकर्सन

4
@DavidCesarino फ़ॉन्ट बदलना आपके लिए अस्पष्टता को ठीक करता है - उस विशेष संपादक में जहां आपने इसे सही सेट किया है। जब आप किसी भिन्न संपादक, IDE में कोड पढ़ रहे हों, तो वेब पर स्रोत देख रहे हों (समीक्षा टूल, रिपॉजिटरी, आदि) को देखते हुए एल से एल में परिवर्तन करना हर उस व्यक्ति के लिए अस्पष्टता को ठीक करता है, जिसे आप कभी भी अपना कोड पढ़ सकते हैं। IMHO की प्राथमिकता शिफ्ट की को मिस करना नहीं है। Btw। आप किस फ़ॉन्ट की अनुशंसा करते हैं? मैं मोनोस्पेस पसंद करता हूं और यह लगभग सभी संपादकों, सीएलआई आदि में डिफ़ॉल्ट है जो मैंने देखा है और इस फ़ॉन्ट lऔर 1( 0और Oसम्मान में) काफी समान हैं।
डिंगलपदुम

1
@dingalapadum जैसा कि मैंने कहा, आप सही कह रहे हैं। अस्पष्टता के स्रोतों को हटाना निश्चित रूप से एक सही काम है। मैंने सिर्फ यह कहा कि आपको किसी भी संपादक का उपयोग न करने की कोशिश करनी चाहिए जहां आप आसानी से उनसे गलती कर सकते हैं। दूसरे शब्दों में, रक्षात्मक रूप से कोडिंग का पुराना सुझाव, लेकिन इसके आधार पर नहीं। फ़ॉन्ट के बारे में, यह बहुत ही व्यक्तिगत है, लेकिन मैं हमेशा जब भी मैं कर सकता हूं तो देजा वु सन्स मोनो का उपयोग करता हूं क्योंकि 1) यह मोनोपॉज है; 2) इसमें पात्रों के बीच अस्पष्टता नहीं है; और 3) मुझे इसकी आकृतियाँ, सुंदर और सुशोभित, लगभग एक अच्छे, पठनीय सैंस-सेरिफ़ फ़ॉन्ट (अन्य अच्छी प्रोग्रामिंग फोंट भी "धातु" IMHO) की तरह लगती हैं।
davidcsb

13

मुझे आशा है कि आप थोड़ा सा स्पर्श नहीं करेंगे, लेकिन सोचा था कि आपको यह जानने में दिलचस्पी हो सकती है कि इसके अलावा F(फ्लोट के लिए), D(डबल के लिए), और L(लंबे समय के लिए), और - और क्रमशः के लिए प्रत्यय जोड़ने के लिए एक प्रस्ताव बनाया गया है। । यह बाइट के लिए शाब्दिक सिंटैक्स का उपयोग करते समय बाइट्स (या लघु) सरणियों की आवश्यकता को समाप्त कर देगा। प्रस्ताव से उदाहरण उद्धृत करते हुए:byteshortYS

मुख्य लाभ: यदि प्रस्ताव को अपनाया जाता है तो मंच बेहतर क्यों है?

कोडक कोड की तरह

 byte[] stuff = { 0x00, 0x7F, (byte)0x80,  (byte)0xFF};

के रूप में पुनर्नवीनीकरण किया जा सकता है

 byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy };

जो डार्सी जावा 7 के लिए प्रोजेक्ट कॉइन की देखरेख कर रहा है, और उनका ब्लॉग इन प्रस्तावों को ट्रैक करने का एक आसान तरीका है।


यह अच्छा होगा ... मैंने हमेशा पाया है कि सभी
जातियाँ

मुझे लगता है कि यह इसे जावा 7 में नहीं बनाया गया है। यदि यह भविष्य के अपडेट या जावा 8 में इसे बना देगा तो कोई भी शब्द?
क्रश करें

@ क्रश मैंने कुछ महीने पहले इसे देखने की कोशिश की थी, और जहां तक ​​मैं बता सकता हूं, प्रस्ताव को छोड़ दिया गया था। 0bहालांकि हमें संख्यात्मक शाब्दिक और द्विआधारी साहित्यिकों के लिए उपसर्ग में _ मिला । Whoop।
इरिकसन

यह प्रस्ताव संभवत: जावा के बजाय कोटलिन पर लागू किया जाता है, क्योंकि तांडव नहीं चाहता है कि समुदाय उन्हें बताए कि कैसे काम करना है ... हम 2018 पर हैं और अभी भी इस प्रस्ताव के बारे में कुछ भी नहीं है, दुख की बात है
जोएलबॉनेट

11

डिफ़ॉल्ट रूप से किसी भी अभिन्न आदिम डेटा प्रकार (बाइट, शॉर्ट, इंट, लॉन्ग) को जावा कंपाइलर द्वारा इंट टाइप के रूप में माना जाएगा । के लिए बाइट और लघु , जब तक कि उन्हें सौंपे गए मूल्य अपनी सीमा में है, वहाँ कोई समस्या नहीं है और कोई प्रत्यय आवश्यक है। यदि बाइट को सौंपा गया मूल्य और उनकी सीमा से कम है, तो स्पष्ट प्रकार की कास्टिंग की आवश्यकता होती है।

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

byte b = 130; // CE: range is exceeding.

इस प्रकार के प्रदर्शन को दूर करने के लिए।

byte b = (byte)130; //valid, but chances of losing data is there.

लंबे डेटा प्रकार के मामले में, यह बिना किसी परेशानी के पूर्णांक मान को स्वीकार कर सकता है। मान लीजिए हम जैसे असाइन करते हैं

Long l = 2147483647; //which is max value of int

इस मामले में एल / एल जैसे किसी भी प्रत्यय की आवश्यकता नहीं है। डिफ़ॉल्ट रूप से 2147483647 को माना जाता है कि जावा कंपाइलर इंट टाइप है। आंतरिक प्रकार की ढलाई कंपाइलर द्वारा की जाती है और int को लॉन्ग टाइप के लिए ऑटो प्रमोट किया जाता है।

Long l = 2147483648; //CE: value is treated as int but out of range 

यहां हमें शाब्दिक 2147483648 को लंबे समय तक जावा संकलक के रूप में मानने के लिए एल के रूप में प्रत्यय लगाने की आवश्यकता है।

तो आखिरकार

Long l = 2147483648L;// works fine.


1

ऐसा लगता है कि ये होना अच्छा होगा क्योंकि (मेरा मानना ​​है) यदि आप उस संख्या को निर्दिष्ट कर सकते हैं जो आप टाइप कर रहे हैं तो वह छोटा है तो जावा को इसे डालना नहीं होगा

चूंकि शाब्दिक रूप से पार्सिंग संकलन के समय होता है, इसलिए यह प्रदर्शन के संबंध में बिल्कुल अप्रासंगिक है। एकमात्र कारण shortऔर byteप्रत्यय अच्छा होगा कि यह अधिक कॉम्पैक्ट कोड की ओर ले जाए।


0

यह समझने के लिए कि क्यों intऔर longशाब्दिक के बीच अंतर करना आवश्यक है , विचार करें:

long l = -1 >>> 1;

बनाम

int a = -1;
long l = a >>> 1;

अब जैसा कि आप सही उम्मीद करेंगे, दोनों कोड टुकड़े वैरिएबल को समान मूल्य देते हैं l। भेद करने में सक्षम intऔर longशाब्दिक के बिना , की व्याख्या क्या है -1 >>> 1?

-1L >>> 1 // ?

या

(int)-1 >>> 1 // ?

इसलिए भले ही संख्या सामान्य सीमा में हो, हमें टाइप निर्दिष्ट करना होगा। यदि डिफ़ॉल्ट शाब्दिक के परिमाण के साथ बदल जाता है, तो केवल अंकों को बदलने से अभिव्यक्ति की व्याख्याओं में एक अजीब बदलाव होगा।

ऐसा नहीं होता है byte, shortऔर charक्योंकि उन्हें अंकगणित और बिटवाइज़ ऑपरेशन करने से पहले हमेशा प्रचारित किया जाता है। संभवतः उनका पूर्णांक प्रकार प्रत्यय होना चाहिए, यह कहना है, सरणी आरंभीकरण अभिव्यक्तियों में, लेकिन वहाँ नहीं है। floatप्रत्यय fऔर का उपयोग करता है double d। अन्य शाब्दिकों में असंदिग्ध प्रकार होते हैं, जिनके लिए एक विशेष प्रकार होता है null


मैं वास्तव में उस चीज में दिलचस्पी लूंगा जिसका आप दिनों में मतलब रखते थे। दोनों ही मामलों में मुझे 2147483647 मिले और मुझे समझ नहीं आया कि मुझे कुछ और क्यों करना चाहिए।
अविश्वसनीय जन

@ TheincredibleJan आप सही उम्मीद करेंगे Integer.MAX_VALUE, हालांकि अगर इसके intऔर longशाब्दिक के बीच अंतर करने का कोई तरीका नहीं था तो यह अस्पष्ट होगा। / मुझे इस प्रश्न का स्मरण नहीं है, लेकिन फिर भी मैंने अपना उत्तर स्पष्ट कर दिया है।
टॉम हॉकिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.