अहस्ताक्षरित लंबे समय के बराबर जावा?


106

C ++ में, मुझे 64 बिट अहस्ताक्षरित पूर्णांक तक, के माध्यम से unsigned long long intया के माध्यम से पहुँच प्राप्त करने में मज़ा आया uint64_t। अब, जावा में 64 बिट्स हैं, मुझे पता है। हालाँकि, वे हस्ताक्षरित हैं।

क्या जावा आदिम के रूप में एक अहस्ताक्षरित लंबा (लंबा) उपलब्ध है? मैं इसे कैसे इस्तेमाल करूं?


4
नोट स्वीकृत उत्तर जावा 8 और बाद में पुराना है। नई सुविधा के लिए GigaStore द्वारा उत्तर देखें जहां आप जावा को बिना नंबर के संबंध में पूछ सकते हैं। रोज़मर्रा के उपयोग के लिए नहीं, लेकिन ज़रूरत पड़ने पर काम करें।
बेसिल बॉर्क

जवाबों:


55

मैं ऐसा नहीं मानता। एक बार जब आप एक हस्ताक्षरित लंबे समय से बड़ा जाना चाहते हैं, तो मुझे लगता है कि बिगइन्टेगर जाने के लिए एकमात्र (बॉक्स से बाहर) रास्ता है।


17
यह उत्तर थोड़ा पुराना है (इसे 2009 में पोस्ट किया गया था)। जावा 8 (मार्च 2014 को जारी किया गया) को शुरू करने के लिए, अहस्ताक्षरित लंबे समय के लिए समर्थन है। एक उदाहरण मैं एक जवाब के रूप में नीचे पोस्ट की जाँच करें।
अमृत

140

जावा 8 को शुरू करने के लिए, अहस्ताक्षरित लंबे (64 बिट्स के बिना) का समर्थन है। जिस तरह से आप इसका उपयोग कर सकते हैं वह है:

Long l1 = Long.parseUnsignedLong("17916881237904312345");

इसे प्रिंट करने के लिए, आप बस l1 प्रिंट नहीं कर सकते हैं, लेकिन आपको पहले करना होगा:

String l1Str = Long.toUnsignedString(l1)

फिर

System.out.println(l1Str);

@ j10, Long ul1 = Long.parseUnsignedLong(objScannerInstance.next("\\d+"));बिल्कुल सुरुचिपूर्ण नहीं है क्योंकि इसमें रेंज चेक की कमी है, लेकिन यह आपको लंबे समय तक संख्यात्मक आदानों में खींचने देगा जो अन्यथा हस्ताक्षरित लंबी की सीमा से अधिक संभव होगा। (इस तथ्य का लाभ उठाते हैं कि Scanner::next(...)या तो एक पैटर्न ऑब्जेक्ट या स्ट्रिंग पैटर्न को भी स्वीकार कर सकते हैं।)
स्पेंसर डी

यह मुश्किल है।
एलेक्स। Dec१

12

नहीं, वहाँ नहीं है। आपको आदिम longडेटा प्रकार का उपयोग करना होगा और हस्ताक्षर संबंधी समस्याओं से निपटना होगा, या जैसे वर्ग का उपयोग करना होगा BigInteger


7

नहीं, वहाँ नहीं है। जावा के डिजाइनर यह कहते हुए रिकॉर्ड पर हैं कि उन्हें अहस्ताक्षरित स्याही पसंद नहीं थी। इसके बजाय एक BigInteger का उपयोग करें । देखें इस सवाल जानकारी के लिए।


22
मैं गोस्लिंग का सम्मान करता हूं कि उन्होंने क्या किया है, लेकिन मुझे लगता है कि बिना किसी अहस्ताक्षरित के उनकी रक्षा उन सबसे विनम्र बहानों में से एक है जिन्हें आपने कभी नहीं सुना। :-) हम जावा में अहस्ताक्षरित चींटियों की तुलना में अधिक रूखी चीजें प्राप्त कर चुके हैं ... :-)
ब्रायन नोब्लुच

1
जावापोलिस 2007 में गॉस्लिंग ने एक उदाहरण दिया कि भ्रमवश बिना चींटियों के काम करने से कोई फायदा नहीं होता है। जोश बलोच ने बताया कि यह हस्ताक्षरित किलों के लिए भी काम नहीं करता है। मनमाना आकार पूर्णांक ftw!
टॉम हॉल्टिन -


2
@PP: मुझे नहीं लगता कि समझदार नियमों को परिभाषित करना संभव है जो हस्ताक्षरित और अहस्ताक्षरित प्रकारों के बीच मुक्त बातचीत की अनुमति देता है जब उनमें से कम से कम एक ने रैपिंग व्यवहार को परिभाषित किया हो। कहा जा रहा है, अहस्ताक्षरित बाइट या अहस्ताक्षरित शॉर्ट को शून्य परेशानी का कारण बना होगा क्योंकि बाइट्स अन्य प्रकार के साथ बातचीत नहीं करते हैं। एक बड़ा मुद्दा प्रकारों के लिए रैपिंग व्यवहार को परिभाषित किया जा रहा है जो संख्याओं का प्रतिनिधित्व करने के लिए उपयोग किया जाता है , क्योंकि उन दुर्लभ अवसरों (जैसे हैशकोड गणना) के लिए अलग रैपिंग प्रकार होने से अलग है, जब रैपिंग व्यवहार वास्तव में उपयोगी होता है।
23

3
@PP: मैं कामना करता हूं कि भाषा डिजाइनर बीजगणितीय वलयों (क्या "रैपिंग पूर्णांक" प्रकार) से संख्याओं के महत्व को पहचानेंगे। किसी भी आकार की संख्या को स्पष्ट रूप से किसी भी आकार की अंगूठी में परिवर्तित किया जाना चाहिए, लेकिन रिंगों को केवल फ़ंक्शन के माध्यम से या एक ही आकार की संख्या के लिए स्पष्ट टाइपकास्ट के माध्यम से संख्याओं में बदलना चाहिए । सी का व्यवहार, जहां अहस्ताक्षरित प्रकार आम तौर पर बीजगणितीय रिंगों के रूप में व्यवहार करते हैं लेकिन कभी-कभी संख्याओं के रूप में व्यवहार करते हैं, संभवतः सभी संभावित दुनिया में सबसे खराब है; मैं इससे बचने की इच्छा के लिए गोस्लिंग को दोष नहीं दे सकता, हालांकि उन्होंने ऐसा करने के लिए पूरी तरह से गलत दृष्टिकोण लिया।
23

6

जावा 8 अहस्ताक्षरित लंबे ऑपरेशन का एक सेट प्रदान करता है जो आपको उन लंबे चर को सीधे लंबे समय के बिना इलाज करने की अनुमति देता है, यहां कुछ सामान्य रूप से उपयोग किए जाते हैं:

और हस्ताक्षरित, घटाना और गुणा, हस्ताक्षरित और अहस्ताक्षरित लोंगो के लिए समान हैं।


2
स्रोत कोड में एक त्वरित नज़र मुझे इन विधियों के साथ थोड़ा सतर्क होने के लिए कहता है। जब लोंग वास्तव में नकारात्मक होते हैं (यानी हस्ताक्षरित मामले से अंतर होता है) तो BigInteger वर्ग का उपयोग किया जाएगा। इसका मतलब है कि 8 नए BigIntegers तक का आवंटन किया जाएगा, यह एक बहुत कुछ है और निश्चित रूप से एक प्रदर्शन ड्रॉप है।
18

4

आपके द्वारा निष्पादित किए जाने वाले कार्यों के आधार पर, परिणाम बहुत समान है, हस्ताक्षरित या अहस्ताक्षरित। हालाँकि, जब तक आप तुच्छ परिचालनों का उपयोग नहीं कर रहे हैं तब तक आप BigInteger का उपयोग करेंगे।


4

अहस्ताक्षरित लंबे समय के लिए आप अमरूद पुस्तकालय से अनसाइनग्लॉन्ग क्लास का उपयोग कर सकते हैं :

यह विभिन्न अभियानों का समर्थन करता है:

  • प्लस
  • ऋण
  • बार
  • आधुनिक
  • द्वारा विभाजित

फिलहाल जो चीज गायब है वह है बाइट शिफ्ट ऑपरेटर्स। अगर आपको जरूरत है तो आप जावा से बिगइन्टेगर का उपयोग कर सकते हैं।


3

जावा में अहस्ताक्षरित प्रकार नहीं हैं। जैसा कि पहले ही उल्लेख किया गया है, बिगइंटर के ओवरहेड को उकसाएं या देशी कोड का उपयोग करने के लिए जेएनआई का उपयोग करें।


15
char एक अहस्ताक्षरित 16-बिट मान है;)
पीटर लॉरी

2

Org.apache.axis.types पैकेज में ए

अनसोल्डलॉन्ग क्लास।

मावेन के लिए:

<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>

0

जावा 8 की तरह लगता है कि पुराने अच्छे [हस्ताक्षरित] लंबे समय के बिना इलाज के लिए कुछ तरीकों को लॉन्ग में जोड़ा जाता है। एक वर्कअराउंड की तरह लगता है, लेकिन कभी-कभी मदद कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.