2009-02-03 17 views
95

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

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

+3

** नोट ** स्वीकार किए जाते हैं जवाब जावा 8 की और बाद में के रूप में पुरानी है। नई सुविधा के लिए [गीगास्टोर द्वारा उत्तर] (http://stackoverflow.com/a/25248688/642706) देखें जहां आप जावा को किसी संख्या के हस्ताक्षर किए जाने के लिए कह सकते हैं। रोजमर्रा के उपयोग के लिए नहीं, लेकिन जब आपको इसकी ज़रूरत होती है तो आसान होती है। –

उत्तर

51

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

+14

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

7

नहीं, ऐसा नहीं है। जावा के डिजाइनर रिकॉर्ड के रूप में कह रहे हैं कि उन्हें बिना हस्ताक्षर किए गए इंट्स पसंद नहीं आया। इसके बजाय BigInteger का उपयोग करें। विवरण के लिए this question देखें।

+19

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

+0

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

+21

मैंने गोस्लिंग का सम्मान नहीं किया है जो उसने किया है। यह कहने के लिए कि लोग हस्ताक्षरित गणित को नहीं समझते हैं? यह गणित पर हस्ताक्षर है जो जटिल है, खासकर बिट स्तर पर। मुझे समझ में नहीं आ रहा है कि लोगों को जावा क्यों पसंद है जब यह बेवकूफ लोगों के लिए स्पष्ट रूप से लिखा गया था (शायद यह कंप्यूटर विज्ञान का सबसे सूक्ष्म मजाक है?)। –

12

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

3

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

+14

char एक हस्ताक्षरित 16-बिट मान है;) –

+6

ARGH! तुम मुझे वहां ले गए। ठीक है मेरे दोस्त – basszero

4

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

0

जावा 8 some methods are added में पुराने पुराने [हस्ताक्षरित] लंबे समय तक हस्ताक्षर किए जाने के लिए लंबे समय तक ऐसा लगता है। एक कामकाज की तरह लगता है, लेकिन कभी-कभी मदद कर सकता है।

4

अहस्ताक्षरित के लिए जब तक आप Guava library से UnsignedLong वर्ग का उपयोग कर सकते हैं:

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

  • प्लस
  • शून्य से
  • बार
  • आधुनिक
  • dividedBy

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

117

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

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

यह मुद्रित करने के लिए, तो आप बस एल 1 मुद्रित नहीं कर सकते, लेकिन आप पहली बार के लिए है:

String l1Str = Long.toUnsignedString(l1) 

फिर

System.out.println(l1Str); 
+0

क्या हम एक तरीका है जिसे हम स्कैनर – j10

+0

@ जे 10, 'लांग उल 1 = लॉन्ग.परसेउन्साइन लोंग (objScannerInstance.next ("\\ d +")) से एक हस्ताक्षरित लंबे समय तक पढ़ सकते हैं;' बिल्कुल बिल्कुल सुरुचिपूर्ण नहीं है क्योंकि इसमें एक सीमा नहीं है जांचें, लेकिन यह आपको लंबे संख्यात्मक इनपुट में खींचने देगा जो अन्यथा संभवतः एक हस्ताक्षरित लंबे समय की सीमा से अधिक हो जाएगा। _ (इस तथ्य को लेता है कि 'स्कैनर :: अगला (...)' या तो पैटर्न ऑब्जेक्ट या स्ट्रिंग पैटर्न को भी स्वीकार कर सकता है।) _ – SpencerD

6

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

  • स्ट्रिंग toUnsignedString (लंबी i)
  • पूर्णांक compareUnsigned (लंबी एक्स, लंबे वाई)
  • लंबे divideUnsigned (लंबी लाभांश, लंबे समय से भाजक)
  • लंबे remainderUnsigned (लंबी लाभांश, लंबे समय से भाजक)

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

+1

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

1

org.apache.axis.types पैकेज एक

UnsignedLong वर्ग है।

Maven के लिए

:

<dependency> 
    <groupId>org.apache.axis</groupId> 
    <artifactId>axis</artifactId> 
    <version>1.4</version> 
</dependency> 
संबंधित मुद्दे