2010-03-27 13 views
6
int val = 233; 
byte b = (byte) val; 
System.out.println(b); 

मेरे पास एक साधारण मामला है: मेरे पास कुछ मान & के साथ एक पूर्णांक है, मैं उस मान को आउटपुट के लिए बाइट में परिवर्तित करना चाहता हूं। लेकिन इस मामले में, एक नकारात्मक मूल्य आ रहा है।जावा में int से int को असाइन करना?

मैं बाइट प्रकार के लिए int मान को सफलतापूर्वक कैसे रख सकता हूं?

+1

दुर्भाग्यवश जावा में बाइट्स पर हस्ताक्षर किए गए हैं। आप बस इतना कर सकते हैं कि एक बड़ा डेटा प्रकार या कस्टम क्लास आज़माएं। – missingfaktor

+0

@ उपयोगकर्ता 303218: वैल मूल्यों की सीमा क्या है? 0-255? – Roman

+0

@ राहुल, बाइट्स "दुर्भाग्यपूर्ण" क्यों हस्ताक्षर किए गए हैं? –

उत्तर

14

जावा में byte रेंज -128 से 127 है। आप बिना किसी बहने के बाइट में पूर्णांक 233 को स्टोर नहीं कर सकते हैं।

+1

या इसके बजाय - आप कर सकते हैं, लेकिन आप बाइट बह रहे हैं। –

14

जावा के byte एक हस्ताक्षरित 8 बिट सांख्यिक प्रकार चुनें जिसकी रेंज है -128127 (JLS 4.2.1) करने के लिए। 233 इस सीमा के बाहर है; वही बिट पैटर्न इसके बजाय -23 का प्रतिनिधित्व करता है।

11101001 = 1 + 8 + 32 + 64 + 128 = 233 (int) 
      1 + 8 + 32 + 64 - 128 = -23 (byte) 

ने कहा कि यही कारण है कि अगर आप एक बाइट में एक int के पहले 8 बिट भंडारण पर जोर देते हैं, तो byteVariable = (byte) intVariable यह करता है। यदि आपको इसे int पर वापस डालना है, तो आपको किसी भी संभावित साइन एक्सटेंशन (यानी, intVariable = byteVariable & 0xFF;) मास्क करना होगा।

5

यदि आपको बाइट उपयोग b&0xFF के हस्ताक्षरित मूल्य की आवश्यकता है।

8

आप बाइट में 256 मानों का उपयोग कर सकते हैं, डिफ़ॉल्ट सीमा -128 से 127 है, लेकिन यह कुछ अनुवाद के साथ किसी भी 256 मानों का प्रतिनिधित्व कर सकती है। आपके मामले में आपको बस बिट्स को मास्क करने के सुझाव का पालन करना है।

int val =233; 
byte b = (byte)val; 
System.out.println(b & 0xFF); // prints 233. 
0

चूंकि बाइट प्रकृति में हस्ताक्षर किए गए हैं, इसलिए यह मूल्यों की 128 से 127 रेंज स्टोर कर सकता है। टाइपकास्टिंग के बाद इसे परिभाषित सीमा से भी अधिक मूल्यों को स्टोर करने की अनुमति है, लेकिन परिभाषित सीमा का साइकलिंग निम्नानुसार होता है। cycling nature of range

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