Equivalente Java di unsigned long long?


106

In C ++, mi è piaciuto avere accesso a un intero senza segno a 64 bit, tramite unsigned long long into tramite uint64_t. Ora, in Java i long sono 64 bit, lo so. Tuttavia, sono firmati.

Esiste un lungo (lungo) senza segno disponibile come primitiva Java? Come lo uso?


4
NOTA La risposta accettata è obsoleta a partire da Java 8 e versioni successive. Vedere la risposta di GigaStore per la nuova funzionalità in cui è possibile chiedere a Java di considerare un numero come non firmato. Non per l'uso quotidiano, ma a portata di mano quando ne hai bisogno.
Basil Bourque,

Risposte:


55

Non credo proprio. Una volta che vuoi andare più grande di un lungo firmato, penso che BigInteger sia l'unico modo (fuori dagli schemi) per andare.


17
Questa risposta è un po 'datata (è stata pubblicata nel 2009). A partire da Java 8 (rilasciato a marzo 2014), è disponibile il supporto per unsigned long. Controlla un esempio che ho pubblicato di seguito come risposta.
Amr

140

A partire da Java 8, è disponibile il supporto per unsigned long (64 bit senza segno). Il modo in cui puoi usarlo è:

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

Per stamparlo, non puoi semplicemente stampare l1, ma devi prima:

String l1Str = Long.toUnsignedString(l1)

Poi

System.out.println(l1Str);

@ j10, Long ul1 = Long.parseUnsignedLong(objScannerInstance.next("\\d+"));Non esattamente elegante perché manca un controllo dell'intervallo, ma ti consentirebbe di inserire input numerici lunghi che altrimenti potrebbero superare l'intervallo di un lungo con segno. (Fa leva sul fatto che Scanner::next(...)può anche accettare un oggetto Pattern o un pattern String.)
Spencer D

è difficile.
Alex78191

12

No, non c'è. Dovrai utilizzare il longtipo di dati primitivo e gestire i problemi di firma o utilizzare una classe come BigInteger.


7

No, non c'è. I progettisti di Java hanno dichiarato che non gli piacevano gli int non firmati. Utilizza invece un BigInteger . Vedi questa domanda per i dettagli.


22
Rispetto Gosling per quello che ha fatto, ma penso che la sua difesa di nessun int non firmato sia una delle scuse più stupide che abbia mai sentito. :-) Abbiamo cose mooolto più traballanti in Java che non firmati int ... :-)
Brian Knoblauch

1
Gosling a JavaPolis 2007 ha fornito un esempio che in modo confuso non funziona per gli interi senza segno. Josh Bloch ha sottolineato che non funziona neanche per gli int firmati. Numeri interi di dimensioni arbitrarie ftw!
Tom Hawtin - tackline


2
@PP .: Non credo sia possibile definire regole sensate che consentano la libera interazione tra i tipi con segno e senza segno quando almeno uno di loro ha un comportamento di avvolgimento definito. Detto questo, byte senza segno o corto senza segno avrebbe causato zero problemi poiché i byte non interagiscono comunque con altri tipi. Un problema più grande è avere definito il comportamento di avvolgimento per i tipi utilizzati per rappresentare numeri , distinto dall'avere tipi di avvolgimento separati per quelle rare occasioni (come i calcoli hashcode) in cui il comportamento di avvolgimento è effettivamente utile.
supercat

3
@PP .: Vorrei che i progettisti del linguaggio riconoscessero l'importanza di distinguere i numeri dagli anelli algebrici (cosa sono i tipi di "intero avvolgente"). Qualsiasi numero di dimensione dovrebbe convertirsi implicitamente in un anello di qualsiasi dimensione, ma gli anelli dovrebbero convertirsi in numeri solo tramite la funzione o tramite typecast esplicito allo stesso numero di dimensione . Il comportamento di C, dove i tipi senza segno generalmente si comportano come anelli algebrici ma a volte si comportano come numeri è probabilmente il peggiore di tutti i mondi possibili; Non posso criticare Gosling per aver voluto evitarlo, anche se ha adottato un approccio totalmente sbagliato per farlo.
supercat

6

Java 8 fornisce una serie di operazioni lunghe senza segno che ti consentono di trattare direttamente quelle variabili Long come lunghe senza segno, eccone alcune di uso comune:

E le addizioni, le sottrazioni e le moltiplicazioni sono le stesse per i long firmati e non firmati.


2
Una rapida occhiata al codice sorgente mi dice di essere un po 'cauto con questi metodi. Quando i long sono effettivamente negativi (cioè c'è una differenza dal caso firmato) verrà utilizzata la classe BigInteger. Ciò significa che verranno allocati fino a 8 nuovi BigInteger, questo è abbastanza e sicuramente un calo delle prestazioni.
Toonijn

4

A seconda delle operazioni che intendi eseguire, il risultato è più o meno lo stesso, firmato o non firmato. Tuttavia, a meno che tu non stia usando operazioni banali, finirai per usare BigInteger.


4

Per unsigned long puoi usare la classe UnsignedLong dalla libreria Guava :

Supporta varie operazioni:

  • più
  • meno
  • volte
  • mod
  • diviso per

La cosa che sembra mancare al momento sono gli operatori di spostamento di byte. Se hai bisogno di quelli puoi usare BigInteger da Java.


3

Java non ha tipi non firmati. Come già accennato, incorrere nel sovraccarico di BigInteger o utilizzare JNI per accedere al codice nativo.


15
char è un valore a 16 bit senza segno;)
Peter Lawrey

2

Il pacchetto org.apache.axis.types ha l'estensione

Classe UnsignedLong.

per Maven:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.