Java equivalente de unsigned long long?

106

En C ++, disfruté tener acceso a un entero sin signo de 64 bits, via unsigned long long into via uint64_t. Ahora, en Java, los longs son de 64 bits, lo sé. Sin embargo, están firmados.

¿Hay un unsigned long (long) disponible como primitiva de Java? ¿Como lo uso?

once81
fuente
4
NOTA La respuesta aceptada está desactualizada a partir de Java 8 y versiones posteriores. Consulte la Respuesta de GigaStore para conocer la nueva función en la que puede pedirle a Java que considere un número como sin firmar. No es para uso diario, pero es útil cuando lo necesita.
Basil Bourque

Respuestas:

55

No lo creo. Una vez que quiera ir más grande que un largo firmado, creo que BigInteger es el único camino a seguir (listo para usar).

Sean Bright
fuente
17
Esta respuesta está un poco desactualizada (se publicó en 2009). A partir de Java 8 (lanzado en marzo de 2014), hay soporte para unsigned long. Verifique un ejemplo que publiqué a continuación como respuesta.
Amr
140

A partir de Java 8, hay soporte para unsigned long (64 bits sin firmar). La forma en que puedes usarlo es:

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

Para imprimirlo, no puede simplemente imprimir l1, sino que primero debe:

String l1Str = Long.toUnsignedString(l1)

Luego

System.out.println(l1Str);
Amr
fuente
@ j10, Long ul1 = Long.parseUnsignedLong(objScannerInstance.next("\\d+"));No es exactamente elegante porque carece de una verificación de rango, pero le permitiría ingresar entradas numéricas largas que de otro modo excederían el rango de un largo con signo. (Aprovecha el hecho de que Scanner::next(...)también puede aceptar un objeto Pattern o un patrón String.)
Spencer D
es difícil.
Alex78191
12

No, no lo hay. Tendrá que usar el longtipo de datos primitivo y lidiar con problemas de firma, o usar una clase como BigInteger.

Adam Rosenfield
fuente
7

No, no lo hay. Los diseñadores de Java están registrados diciendo que no les gustaban las entradas sin firmar. En su lugar, use un BigInteger . Consulte esta pregunta para obtener más detalles.

Paul Tomblin
fuente
22
Respeto a Gosling por lo que ha hecho, pero creo que su defensa de que no hay entradas sin firmar es una de las excusas más tontas que he escuchado. :-) Tenemos muchas más cosas raras en Java que entradas sin firmar ... :-)
Brian Knoblauch
1
Gosling en JavaPolis 2007 dio un ejemplo que confusamente no funciona para entradas sin firmar. Josh Bloch señaló que tampoco funciona para entradas firmadas. Enteros de tamaño arbitrario ftw!
Tom Hawtin - tackline
2
@PP .: No creo que sea posible definir reglas sensibles que permitan la interacción libre entre tipos firmados y no firmados cuando al menos uno de ellos tiene un comportamiento de envoltura definido. Dicho esto, el byte sin firmar o el short sin firmar no habrían causado ningún problema, ya que los bytes no interactúan con otros tipos de todos modos. Un problema mayor es tener un comportamiento de envoltura definido para los tipos que se utilizan para representar números , a diferencia de tener tipos de envoltura separados para esas raras ocasiones (como cálculos de código hash) cuando el comportamiento de envoltura es realmente útil.
supercat
3
@PP .: Me gustaría que los diseñadores de lenguaje reconocieran la importancia de distinguir los números de los anillos algebraicos (qué son los tipos de "enteros envolventes"). Cualquier número de tamaño debe convertirse implícitamente en un anillo de cualquier tamaño, pero los anillos solo deben convertirse en números a través de una función o mediante una conversión encasillada explícita al mismo número de tamaño . El comportamiento de C, donde los tipos sin signo generalmente se comportan como anillos algebraicos pero a veces se comportan como números, es probablemente el peor de todos los mundos posibles; No puedo culpar a Gosling por querer evitar eso, aunque tomó un enfoque totalmente equivocado para hacerlo.
supercat
6

Java 8 proporciona un conjunto de operaciones largas sin firmar que le permite tratar directamente esas variables Long como Long sin firmar, aquí hay algunas de uso común:

Y las sumas, restas y multiplicaciones son las mismas para largos con signo y sin signo.

Keelar
fuente
2
Un vistazo rápido al código fuente me dice que sea un poco cauteloso con estos métodos. Cuando los largos son realmente negativos (es decir, hay una diferencia con el caso con signo), se utilizará la clase BigInteger. Esto significa que se asignarán hasta 8 nuevos BigIntegers, esto es bastante y definitivamente una caída de rendimiento.
Toonijn
4

Dependiendo de las operaciones que pretenda realizar, el resultado es prácticamente el mismo, firmado o no firmado. Sin embargo, a menos que esté usando operaciones triviales, terminará usando BigInteger.

Peter Lawrey
fuente
4

Durante tiempo sin firmar, puede usar la clase UnsignedLong de la biblioteca de Guava :

Admite varias operaciones:

  • más
  • menos
  • veces
  • modificación
  • dividido por

Lo que parece faltar en este momento son los operadores de desplazamiento de bytes. Si los necesita, puede usar BigInteger de Java.

Andrejs
fuente
3

Java no tiene tipos sin firmar. Como ya se mencionó, aumente la sobrecarga de BigInteger o use JNI para acceder al código nativo.

basszero
fuente
15
char es un valor de 16 bits sin firmar;)
Peter Lawrey
2

El paquete org.apache.axis.types tiene un

Clase UnsignedLong.

para maven:

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

Parece que en Java 8 se agregan algunos métodos a Long para tratar los viejos buenos [firmados] siempre que no estén firmados. Parece una solución alternativa, pero a veces puede ayudar.

Mikalai Sabel
fuente