मुझे नहीं पता कि यह एक इंट के रूप में लंबे डेटा प्रकार की बात क्यों कर रहा है
यह नहीं। आपको संकलक के संदेशों पर भरोसा करना सीखना चाहिए (विशेषकर जब वे समझदार, आधुनिक संकलक हों और प्राचीन C / C ++ संकलक न हों)। जबकि वे जो भाषा बोलते हैं, उसे कई बार समझना मुश्किल हो सकता है, लेकिन वे आमतौर पर आपसे झूठ नहीं बोलते हैं।
आइए इसे फिर से देखें:
इंट 9223372036854775807 का शाब्दिक सीमा से बाहर है।
ध्यान दें, कि यह आपके चर या प्रकार का कहीं भी उल्लेख नहीं करता है , इसलिए यह आरंभीकरण के बारे में नहीं है। समस्या किसी अन्य बिंदु पर होने लगती है।testLonglong
अब संदेश के कुछ हिस्सों की जांच करने देता है:
intहमें बताता है कि वह एक intमूल्य के रूप में कुछ करना चाहता है (जो आप चाहते थे वह नहीं है!)
- "सीमा से बाहर" बहुत स्पष्ट है: कुछ अपेक्षित सीमा के भीतर नहीं है (शायद वह
int)
- "शाब्दिक": अब यह दिलचस्प है: एक शाब्दिक क्या है?
मैं एक पल के लिए शाब्दिक के बारे में बात करने के लिए आरामदायक सूची छोड़ दूँगा: शाब्दिक वे स्थान हैं जहाँ आपके कोड में कुछ मूल्य हैं। हैं Stringशाब्दिक, intशाब्दिक, classशाब्दिक और इतने पर। हर बार जब आप अपने कोड में एक मूल्य का स्पष्ट रूप से उल्लेख करते हैं, तो यह एक शाब्दिक है।
तो यह वास्तव में आपको चर घोषणा के बारे में परेशान नहीं कर रहा है, लेकिन खुद संख्या, मूल्य यह है कि यह आपके बारे में क्या कर रहा है।
आप एक संदर्भ में एक ही शाब्दिक का उपयोग करके इसे आसानी से सत्यापित कर सकते हैं जहां a longऔर intसमान रूप से स्वीकार्य हैं:
System.out.println(9223372036854775807);
PrintStream.printlnया तो एकint या एकlong (या बहुत कुछ और) ले सकते हैं । ताकि कोड ठीक होना चाहिए, है ना?
नहीं। ठीक है, शायद यह चाहिए हो, लेकिन नियमों के अनुसार यह है ठीक नहीं।
समस्या यह है कि "कुछ अंक" को एक intशाब्दिक के रूप में परिभाषित किया गया है और इसलिए इसके द्वारा परिभाषित सीमा में होना चाहिए int।
यदि आप एक लिखने के लिए चाहते हैं, तो longशाब्दिक, तो आप उस जोड़कर स्पष्ट करना चाहिए L(या लोअर केस l, लेकिन मैं अत्यधिक , सुझाव है कि आप हमेशा अपर-केस भिन्न रूप का उपयोग, क्योंकि यह एक के लिए बहुत आसान को पढ़ने के लिए है और कठिन गलती करने के लिए 1)।
ध्यान दें कि एक समान समस्या float(पोस्टफ़िक्स F/ f) और double(पोस्टफ़िक्स D/ d) के साथ होती है।
साइड नोट: आपको पता चलेगा कि कोई शाब्दिक byteया shortशाब्दिक नहीं हैं और आप अभी भी मान (आमतौर पर intशाब्दिक) असाइन कर सकते हैं byteऔर shortचर कर सकते हैं: यह असाइनमेंट कन्वर्सेशन के बारे में possible 5.2 में विशेष नियमों के कारण संभव है : वे एक बड़े प्रकार के निरंतर अभिव्यक्ति के असाइनमेंट की अनुमति देते हैं करने के लिए byte, short, charया int अगर मान प्रकार के भीतर लेकर कर रहे हैं।