2010-01-04 18 views
28
 //key & hash are both byte[] 
     int leftPos = 0, rightPos = 31; 
     while(leftPos < 16) { 
      //possible loss of precision. required: byte, found: int 
      key[leftPos] = hash[leftPos]^hash[rightPos]; 
      leftPos++; 
      rightPos--; 
     } 

जावा में दो बाइट्स पर थोड़ा सा ऑपरेशन क्यों एक int वापस करेगा? मुझे पता है कि मैं इसे वापस बाइट में डाल सकता हूं, लेकिन यह मूर्खतापूर्ण लगता है।दो बाइट्स पर एक्सओ ऑपरेटर एक int उत्पन्न क्यों करता है?

+0

संदर्भ के लिए: http: //java.sun .com/डॉक्स/पुस्तकों/jls/तृतीय_डिशन/एचटीएमएल/रूपांतरण.html # 5.6.2 और http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5233। मुझे तर्क नहीं पता, इसलिए मैं जवाब पोस्ट नहीं कर रहा हूं। –

+0

सेकेंडेड। मैं कुछ भी नहीं बता रहा * क्यों * उपर्युक्त होता है, बस यह करता है। –

+1

कई कारणों से प्रचार पदोन्नति मौजूद है। बिटवाई ऑपरेशंस के लिए यह लगभग सभी लोगों की तुलना में बहुत कम समझ में आता है, लेकिन फिर क्यों नहीं? आप इसे हमेशा वापस कर सकते हैं। –

उत्तर

20

क्योंकि भाषा का नमूना ऐसा कहता है। यह कोई कारण देता है, लेकिन मुझे लगता है कि इन सबसे अधिक संभावना इरादों हैं:

  • नियमों का एक छोटा सा और सरल सेट अंकगणितीय आपरेशनों प्रकार
  • के सभी संभव संयोजनों को शामिल कवर करने के लिए एक कुशल कार्यान्वयन की अनुमति करने के लिए - 32 बिट पूर्णांक सीपीयू आंतरिक रूप से उपयोग करते हैं, और बाकी सभी को रूपांतरण, स्पष्ट या निहित की आवश्यकता होती है।
+3

मूल 32 बिट सीपीयू ऑपरेशंस का उपयोग करना सबसे संभावित कारण है। – mletterle

2

दो बाइट्स पर कोई जावा बिटवाई ऑपरेशन नहीं है। आपका कोड निहित और चुपचाप उन बाइट्स को एक बड़े पूर्णांक प्रकार (int) में परिवर्तित करता है, और परिणाम उस प्रकार का भी है।

अब आप बाइट्स अपरिभाषित पर बिटवाई ऑपरेशंस छोड़ने की संवेदना पर सवाल उठा सकते हैं।

+0

फिर, सवाल था * क्यों * ऐसा होता है। –

+2

यही कारण है कि ऐसा होता है, जो प्रश्न मुझे लगता है कि आप खोज रहे हैं, "उन्होंने बाइट प्रकार ऑपरेटर को बाइट प्रकार पर छोड़ने का फैसला क्यों किया, जो अनिश्चित रूप से अंतर्निहित कलाकारों को जरूरी है?" – mletterle

+3

ऑपरेशन * * अनिर्धारित नहीं हैं; वास्तव में वे काफी स्पष्ट रूप से परिभाषित हैं। यह सिर्फ इतना है कि परिणाम एक int है और स्पष्ट कास्टिंग के बिना बाइट [] में संग्रहीत नहीं किया जा सकता है। –

0

यह कहीं न कहीं उत्तर में नीचे समान प्रश्नों में से एक है कि लोगों को पहले ही बताया है करने के लिए किया गया था:

http://blogs.msdn.com/oldnewthing/archive/2004/03/10/87247.aspx

+1

इनमें से किसी भी उदाहरण में थोड़ा सा ऑपरेटर शामिल नहीं है, जो मेरे ज्ञान के लिए अतिप्रवाह/अंडरफ्लो का कारण नहीं बन सकता है। – defectivehalt

4

यदि यह सही है और कोई मूल्य नहीं है कि परिशुद्धता के इस नुकसान हो सकता है देखते हैं दूसरे शब्दों में: "परिशुद्धता के असंभव नुकसान" संकलक चुप रहो चाहिए ... और सुधार करने की आवश्यकता है, और कोई डाली इस में जोड़ा जाना चाहिए:

byte a = (byte) 0xDE; 
byte b = (byte) 0xAD; 
byte r = (byte) (a^b);