2010-12-15 15 views
13

मैं एक मौजूदा नेटवर्क प्रोटोकॉल को कार्यान्वित करने की कोशिश कर रहा हूं जो अनसigned डेटाटाइप का भारी उपयोग करता है, जो जावा द्वारा समर्थित नहीं हैं। मैं वर्तमान में जो करता हूं वह प्रत्येक डेटाटाइप के लिए होता है, अगले बड़े को चुना जाता है ताकि हस्ताक्षरित संख्या सकारात्मक क्षेत्र में फिट हो और फिर वांछित प्रभाव प्राप्त करने के लिए बाइट स्थानांतरण का उपयोग कर सके। चूंकि यह बहुत ग़लत त्रुटि है और एक हस्ताक्षरित लंबे समय तक मुझे बिगइन्टर का उपयोग करना है जो विस्तारित प्रकारों से बहुत भारी है, मैं सोच रहा था कि यह हासिल करने का कोई बेहतर तरीका नहीं है?जावा में बिना हस्ताक्षर किए गए int

उत्तर

16

आप जो कर रहे हैं उसके आधार पर, आप 32-बिट मान के रूप में लंबे समय तक 64-बिट मान और int के रूप में लंबे समय तक इलाज कर सकते हैं। ज्यादातर ऑपरेशन esp पढ़ते हैं INT/Long writeInt/लंबे समय तक साइन इन को अनदेखा करके ही काम करते हैं।

क्या आप इन नंबरों पर किए गए ऑपरेशन का एक उदाहरण दे सकते हैं और शायद हम सुझाव दे सकते हैं कि प्रकार का विस्तार किए बिना वही काम कैसे करेगा।

उदाहरण के लिए, ++, -, +, -, *, ==,! =, < < सभी हस्ताक्षर के बावजूद समान काम करते हैं (यानी एक ही जवाब दें)। >> >> >>

यह /,%,>,> = <, < = और प्रिंटिंग फ़ंक्शंस जो हस्ताक्षरित मूल्य मानते हैं, लेकिन आप इनके आसपास काम करने में सक्षम होना चाहिए (यदि आप उपयोग करते हैं इन)।

उदा

long unsignedA = 
long unsignedB = 
boolean greater = unsignedA + Long.MIN_VALUE > unsignedB + Long.MIN_VALUE 

संपादित करें: यह क्यों काम करता है? आंशिक रूप से क्योंकि जावा में अतिप्रवाह/अंडरफ्लो अपवाद नहीं हैं।

उदा

byte unsignedA = 0; 
unsignedA--; 
// unsignedA == FF, is this -1 or 255? Java assumes the former but you assume the later 

byte unsignedB = unsignedA * unsignedA; 
// unsignedB is -1 * -1 = 1 or (byte) (255*255) = (byte) 65525 = 1. 
+0

एचएम, जो वादा करता है, मैं केवल एक इनपुटस्ट्रीम बनाने की उम्मीद कर रहा था और उस पर से प्रोग्राम में चारों ओर खींचने की बजाय अपेक्षाओं के साथ काम करता हूं। समस्या यह है कि अधिकांश भाग के लिए वे आईपी पते, संस्करण संख्याओं (बहुत भारी>><, <= and > =) का प्रतिनिधित्व करते हैं, क्रिप्टोशैश (शायद कोई समस्या नहीं है, और टाइमस्टैम्प (फिर तुलना में भारी)। – cdecker

+0

आईपी पते के लिए, आपको बाउजिंग चाल का उपयोग करना होगा या लंबे समय तक विस्तार करना होगा। लंबे टाइमस्टैम्प के लिए, आपको यह मानने में सक्षम होना चाहिए कि वे 0 और Long.MAX_VALUE के बीच हैं यदि वे मिलीसेकंड में हैं। क्या आपके संस्करण संख्या शीर्ष बिट का उपयोग करते हैं? क्या आप एक उदाहरण दे सकते हैं जो करता है? (यदि ऐसा है तो आपको तुलनात्मक पूर्वाग्रह की भी आवश्यकता है) –

+0

हस्ताक्षर किए गए लंबे मिली-सेकंड टाइमस्टैम्प वर्ष 2 9 2,471,208 तक सीमित हैं यदि आप 1 ईसा पूर्व (कोई वर्ष 0 नहीं था), –

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