2008-11-25 15 views
53

मैं एल को मूल्य में जोड़कर एक शाब्दिक लंबा बना सकता हूं; मैं कुछ समान तरीके से एक शाब्दिक लघु या बाइट क्यों नहीं बना सकता? मुझे एक कलाकार के साथ एक शाब्दिक अक्षर का उपयोग करने की आवश्यकता क्यों है?जावा में कोई बाइट या लघु अक्षर क्यों नहीं हैं?

और यदि उत्तर "क्योंकि सी में कोई छोटा अक्षर नहीं था", तो सी में कोई छोटा अक्षर क्यों नहीं है?

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

उत्तर

15

सी में, int कम से कम सीपीयू के "प्राकृतिक" शब्द आकार और long का मतलब "बड़ा प्राकृतिक" शब्द आकार होना था (उस अंतिम भाग में निश्चित नहीं है, लेकिन यह भी समझाएगा क्यों int और long x86 पर समान आकार है)।

अब, मेरा अनुमान है: int और long के लिए, एक प्राकृतिक प्रतिनिधित्व है जो मशीन के रजिस्टरों में बिल्कुल फिट बैठता है। अधिकांश CPUs पर, छोटे प्रकार byte और short को उपयोग किए जाने से पहले int पर पैड किया जाना होगा। यदि ऐसा है, तो आप भी एक कास्ट कर सकते हैं।

8

मुझे संदेह है कि "यह वास्तव में मूल्य जोड़ता है जब तक यह भाषा में कुछ भी न जोड़ें" - और इसे लायक होने के लिए पर्याप्त रूप से कम मूल्य जोड़ने के रूप में देखा गया था। जैसा कि आपने कहा है, गोल करना आसान है, और स्पष्ट रूप से यह शायद ही कभी आवश्यक है (केवल असंबद्धता के लिए)।

सी # में भी यही सच है, और मैंने इसे कभी भी किसी भी भाषा में याद नहीं किया है। जावा में जो मुझे याद आती है वह एक हस्ताक्षरित बाइट प्रकार है :)

+4

हाँ, अहस्ताक्षरित बाइट :(। हाथ में जारी करने के लिए जोड़ने के लिए कृपया, मुझे लगता है कि यह उल्लेख करने के लिए लायक है वहाँ एक लंबे iteral वजह से है एक int शाब्दिक लंबे समय के सभी मूल्यों का प्रतिनिधित्व नहीं कर सकता है। लेकिन एक int दूसरी तरफ एक छोटे से सभी मूल्यों का प्रतिनिधित्व कर सकता है। –

+0

लेकिन मुझे लगता है कि यह मूल्य जोड़ता है - कास्ट नहीं करना एक बड़ा फायदा हो सकता है। 'छोटा वैल = छोटा) (वैल +10) 'केवल परेशान है हालांकि जावा को इसके लिए' शॉर्ट 'के अतिरिक्त काम करने की अनुमति भी देनी होगी। – mjaggard

+0

@mjaggard: यह * इसके लायक नहीं होने के लिए पर्याप्त रूप से थोड़ा मूल्य * जोड़ने का मामला है। यह थोड़ा परेशान है, लेकिन सबसे बड़ी समस्या से दूर ... –

5

एक अन्य कारण यह हो सकता है कि JVM को छोटे और बाइट के बारे में पता नहीं है। JVM के अंदर इंक, लम्बे, फ्लोट्स और युगल के साथ सभी गणना और भंडारण किया जाता है।

+1

ठीक है, लेकिन क्या यह हर जेवीएम के बारे में सच है? और यहां तक ​​कि यदि यह भी है, तो क्या भाषा परिभाषा वास्तव में वीएम के कार्यान्वयन विवरण पर निर्भर होनी चाहिए? क्या यह दूसरी तरफ नहीं होना चाहिए? –

+0

यह जेवीएम स्पेक का हिस्सा है, इसलिए हां: जेवीएम के पास यह जानने का कोई तरीका नहीं है कि यह वास्तव में कितना मूल्य है। (सरणी एक्सेस जैसे कुछ संचालन के अलावा, जहां अलग ऑपोड मौजूद हैं)। –

+5

भंडारण * हमेशा इंट्स आदि के साथ नहीं किया जाता है। स्पष्ट उदाहरण बाइट्स की एक सरणी है, जो निश्चित रूप से चींटियों की बजाय बाइट्स की सरणी के रूप में संग्रहीत होती है। यह भी देखें http://stackoverflow.com/questions/229886/size-of-a-byte-in-memory-java –

2

विचार करने के लिए कई चीजें हैं।

1) जैसा कि ऊपर बताया गया है कि जेवीएम में बाइट या लघु प्रकार की कोई धारणा नहीं है। आम तौर पर इन प्रकारों का उपयोग JVM स्तर पर गणना में नहीं किया जाता है; इसलिए कोई सोच सकता है कि इन शाब्दिकों का कम उपयोग होगा।

2) बाइट और लघु चर के प्रारंभ के लिए, यदि int अभिव्यक्ति स्थिर है और प्रकार की अनुमत सीमा में यह निश्चित रूप से लक्ष्य प्रकार पर डाली जाती है।

3) हमेशा शाब्दिक, पूर्व (लघु डाल सकता) 10