जावा 8 और जावा 9 में अहस्ताक्षरित इंटीजर का उपयोग कैसे करें?


82

ओरेकल "आदिम डेटा प्रकार" पृष्ठ में , यह उल्लेख करता है कि जावा 8 अहस्ताक्षरित किलों और लोंगो के लिए समर्थन जोड़ता है:

int: डिफ़ॉल्ट रूप से, intडेटा प्रकार एक 32-बिट हस्ताक्षरित दो का पूरक पूर्णांक है, जिसका न्यूनतम मूल्य −2 31 और अधिकतम मूल्य 2 31 data1 है। जावा एसई 8 और बाद में, आप intएक 32-बिट पूर्णांक का प्रतिनिधित्व करने के लिए डेटा प्रकार का उपयोग कर सकते हैं , जिसका न्यूनतम मान 0 और अधिकतम मान 2 32 .1 है। का प्रयोग करें Integerउपयोग करने के लिए वर्ग intएक अहस्ताक्षरित पूर्णांक के रूप में डेटा प्रकार। अधिक जानकारी के लिए अनुभाग द क्लास क्लासेस देखें। की तरह स्टेटिक तरीकों compareUnsigned, divideUnsignedआदि में जोड़ा गया है Integerअहस्ताक्षरित पूर्णांकों के लिए अंकगणितीय आपरेशनों का समर्थन करने के वर्ग।

long: longडेटा प्रकार 64-बिट दो का पूरक पूर्णांक है। हस्ताक्षरित longका न्यूनतम मूल्य 632 63 और अधिकतम मूल्य 2 63 value1 है। जावा एसई 8 में और बाद में, आप longडेटा प्रकार का उपयोग कर सकते हैं एक अहस्ताक्षरित 64-बिट का प्रतिनिधित्व करने के लिए long, जिसका न्यूनतम मूल्य 0 और अधिकतम 2 64 −1 है। इस डेटा प्रकार का उपयोग तब करें जब आपको इंट द्वारा प्रदान किए गए मूल्यों की तुलना में व्यापक मूल्यों की आवश्यकता हो। Longवर्ग भी तरीकों की तरह होता है compareUnsigned, divideUnsignedआदि अहस्ताक्षरित के लिए अंकगणितीय आपरेशनों का समर्थन करने के long

हालाँकि, मुझे अहस्ताक्षरित लंबी या पूर्णांक घोषित करने का कोई तरीका नहीं है। निम्न कोड, उदाहरण के लिए, "शाब्दिक सीमा से बाहर है" का संकलक त्रुटि संदेश देता है (मैं जावा 8 का उपयोग कर रहा हूं, निश्चित रूप से), जब यह सीमा में होना चाहिए (निर्दिष्ट मूल्य 2 64 641 है) :

public class Foo {
    static long values = 18446744073709551615L;
    
    public static void main(String[] args){
        System.out.println(values);
    }  
}

तो, क्या कोई अहस्ताक्षरित int या लंबे समय तक घोषित करने का कोई तरीका है?


2
Java 8 में आपके Long.MAX_VALUE निरंतर में क्या लौटा है?
ब्रूनो फ्रेंको

21
कोई अहस्ताक्षरित पूर्णांक या अहस्ताक्षरित लंबा प्रकार नहीं है। यदि आप नए तरीकों में से एक का उपयोग करते हैं, तो वह विधि 32-बिट या 64-बिट पूर्णांक का इलाज करेगी क्योंकि यह अहस्ताक्षरित था। लेकिन बस इतना ही। चर के प्रकार पर अभी भी हस्ताक्षर किए जाएंगे, और यह याद रखना है कि आप इसे एक अहस्ताक्षरित संख्या के रूप में उपयोग कर रहे हैं। यदि उन्होंने पर्याप्त लोगों को बग नहीं बनाया तो वे अहस्ताक्षरित शाब्दिक जोड़ नहीं सकते, लेकिन शायद वे उन्हें जावा 9 में जोड़ देंगे। :)
अजब

5
नए तरीकों को जोड़ने के अलावा, उन्होंने वास्तव में कुछ भी नहीं बदला।
हॉट लिक्स

4
जहाँ तक मैं बता सकता हूँ, उन्होंने किया कि वे ऐसे तरीके थे जो अहस्ताक्षरित मूल्यों को वापस कर सकते हैं, लेकिन आपको अहस्ताक्षरित मूल्यों की घोषणा करने की अनुमति नहीं देते हैं। अगर तुम मुझसे पूछते हो, और एक असली दर्द है तो मूर्खतापूर्ण। मुझे आश्चर्य है कि अगर एक तरीका Integer.divideUnsigned का उपयोग करना होगा, तो एक पैरामीटर 1 होने के साथ, दूसरा जो भी नंबर आप चाहते हैं उसे अहस्ताक्षरित माना जाए। जहां तक ​​मैं बता सकता हूं, काम करेगा, लेकिन लगता है कि वास्तव में चीजें करने का मूर्खतापूर्ण तरीका है।
क्लीमेइन

@ जाब मैं अंत में जावा में उचित अहस्ताक्षरित होने के लिए "बगिंग" प्रक्रिया में किसी भी प्रकार की सहायता कैसे कर सकता हूं? :)
मैथ्यू

जवाबों:


52

आपके द्वारा पोस्ट किए गए दस्तावेज़ के अनुसार, और यह ब्लॉग पोस्ट - जब एक अहस्ताक्षरित इंट / लंबे और हस्ताक्षर किए गए के बीच आदिम की घोषणा करते समय कोई अंतर नहीं होता है। "नया समर्थन" इंटेगर और लॉन्ग क्लासेस, जैसे Integer.divideUnsign में स्टैटिक मेथड्स का जोड़ है । यदि आप उन विधियों का उपयोग नहीं कर रहे हैं, तो आपका "अहस्ताक्षरित" लंबे समय तक 2 ^ 63-1 नकारात्मक मूल्य के साथ एक सादा पुराना लंबा है।

एक त्वरित स्किम से, ऐसा नहीं लगता है कि लॉन्ग के लिए +/- 2 ^ 31-1, या +/- 2 ^ 63-1 के बाहर सीमा में पूर्णांक स्थिरांक घोषित करने का एक तरीका है। आपको अपने आउट-ऑफ-रेंज सकारात्मक मूल्य के अनुरूप नकारात्मक मान को मैन्युअल रूप से गणना करना होगा।


88

खैर, यहां तक ​​कि जावा 8 में, longऔर intअभी भी हस्ताक्षर किए गए हैं, केवल कुछ विधियां उनके साथ ऐसा व्यवहार करती हैं जैसे वे अहस्ताक्षरित थे । यदि आप longउस तरह से अहस्ताक्षरित लिखना चाहते हैं , तो आप कर सकते हैं

static long values = Long.parseUnsignedLong("18446744073709551615");

public static void main(String[] args) {
    System.out.println(values); // -1
    System.out.println(Long.toUnsignedString(values)); // 18446744073709551615
}

5
मैं इसके साथ एक अवलोकन यह देखता हूं कि आदेश भ्रष्ट है। अगर मुझे कुछ सिस्टम से एक अहस्ताक्षरित लंबे समय तक प्राप्त करना था (ट्विटर इस तरह से आईडी प्रदान करता है), और उन्हें सॉर्ट करना चाहता था, शायद इसलिए कि मैं उन्हें कालानुक्रमिक होना जानता था, तो लॉन्ग.मैक्स_वैल्यू से परे सब कुछ वास्तव में 0 से पहले दिखाई देगा: नकारात्मक । जावा के कार्यान्वयन :-( साथ इसके बजाय यह प्रतीत होता है एक भी करने के लिए ऐसी है कि अहस्ताक्षरित 0 नक्शे नीचे यह बदलाव करना होगा पर हस्ताक्षर किए Long.MIN_VALUE।
डेविड स्माइली

10
@DavidSmiley अच्छा बिंदु। अहस्ताक्षरित लोंगों को छाँटने के लिए , लोंग डॉट कॉम का प्रयोग करें , या फ़ंक्शन्स को सॉर्ट करने के लिए एक तुलनित्र के रूप में पास करें,
kajacx

26
    // Java 8
    int vInt = Integer.parseUnsignedInt("4294967295");
    System.out.println(vInt); // -1
    String sInt = Integer.toUnsignedString(vInt);
    System.out.println(sInt); // 4294967295

    long vLong = Long.parseUnsignedLong("18446744073709551615");
    System.out.println(vLong); // -1
    String sLong = Long.toUnsignedString(vLong);
    System.out.println(sLong); // 18446744073709551615

    // Guava 18.0
    int vIntGu = UnsignedInts.parseUnsignedInt(UnsignedInteger.MAX_VALUE.toString());
    System.out.println(vIntGu); // -1
    String sIntGu = UnsignedInts.toString(vIntGu);
    System.out.println(sIntGu); // 4294967295

    long vLongGu = UnsignedLongs.parseUnsignedLong("18446744073709551615");
    System.out.println(vLongGu); // -1
    String sLongGu = UnsignedLongs.toString(vLongGu);
    System.out.println(sLongGu); // 18446744073709551615

    /**
     Integer - Max range
     Signed: From −2,147,483,648 to 2,147,483,647, from −(2^31) to 2^31 – 1
     Unsigned: From 0 to 4,294,967,295 which equals 2^32 − 1

     Long - Max range
     Signed: From −9,223,372,036,854,775,808 to 9,223,372,036,854,775,807, from −(2^63) to 2^63 − 1
     Unsigned: From 0 to 18,446,744,073,709,551,615 which equals 2^64 – 1
     */

10
कुछ स्पष्टीकरण जोड़ना चाहिए, न कि केवल कोड को बाहर फेंक दें।
क्लुमेइन

22

जावा 8 या जावा 9 में एक अहस्ताक्षरित लंबे या अंतर को घोषित करने का कोई तरीका नहीं है। लेकिन कुछ तरीके उनके साथ ऐसा व्यवहार करते हैं जैसे कि वे अहस्ताक्षरित थे, उदाहरण के लिए:

static long values = Long.parseUnsignedLong("123456789012345678");

लेकिन यह चर की घोषणा नहीं है ।


3
मैं घायल क्यों नहीं वे आसानी से Uint और ulong प्रकार जोड़ सकते थे
EKanadily

में @docesam इस और इस दस्तावेज विस्तृत विवरण है। संक्षेप में, इंटेगर वर्ग के लिए अहस्ताक्षरित हेरफेर के लिए सिर्फ एक तरीका जोड़ा गया है। और अगर वे आसानी से जोड़ सकते थे तो मुझे नहीं पता कि वे ऐसा क्यों नहीं करेंगे ;-)
1ac0

@ लादिस्लाव DANKO विवेकपूर्ण लोग हैं, और अन्य लोग हैं। मुझे यकीन नहीं है कि अगर इस मामले में - यह विवेकपूर्ण था या नहीं, लेकिन यह मेरी धारणा है कि ओरेकल इतना विवेकपूर्ण नहीं है।
इकाॅनडिली

1
@docesam नहीं, वे "आसानी से यूंट और उलॉन्ग प्रकार" जोड़ नहीं सकते थे। इसके लिए जेएलएस, जेवीएम कल्पना, जेएनआई, बहुत सारे पुस्तकालयों (जैसे जावा.ट्रिल.आर्सेज), परावर्तन, और बहुत कुछ को ओवरहाल करने की आवश्यकता होगी।
Nayuki

1
@ Michaelangel007 अरे, मुझे लगता है कि हम इस विषय को विभिन्न पृष्ठभूमि मान्यताओं के साथ ले रहे हैं। मुझे एक ईमेल शूट करने के लिए देखभाल और हम विवरण के बारे में बात करेंगे?
नायुकी

4

यदि किसी तीसरे पक्ष लाइब्रेरी का उपयोग कर एक विकल्प है, वहाँ है jOOU (से पुस्तकालय बंद स्पिन jOOQ ) है, जो जावा में अहस्ताक्षरित पूर्णांक संख्या के लिए प्रकार आवरण प्रदान करता है। यह बिलकुल एक ही बात नहीं है कि आदिम प्रकार (और इस प्रकार बाइट कोड) में अहस्ताक्षरित प्रकार के लिए समर्थन है, लेकिन शायद यह अभी भी आपके उपयोग के मामले के लिए पर्याप्त है।

import static org.joou.Unsigned.*;

// and then...
UByte    b = ubyte(1);
UShort   s = ushort(1);
UInteger i = uint(1);
ULong    l = ulong(1);

ये सभी प्रकार विस्तारित होते हैं java.lang.Numberऔर इन्हें उच्च क्रम वाले आदिम प्रकारों में परिवर्तित किया जा सकता हैBigInteger

(अस्वीकरण: मैं इन पुस्तकालयों के पीछे कंपनी के लिए काम करता हूं)

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