2009-02-03 50 views
95

En C++, disfruté tener acceso a un entero sin signo de 64 bits, a través de unsigned long long int, o por uint64_t. Ahora, en Java longs son 64 bits, lo sé. Sin embargo, están firmados.equivalente en Java de unsigned long long?

¿Hay un largo (largo) sin signo disponible como primitiva de Java? ¿Como lo uso?

+3

** NOTA ** La respuesta aceptada es obsoleta como de Java 8 y versiones posteriores. Consulte la [Respuesta de GigaStore] (http://stackoverflow.com/a/25248688/642706) para la nueva característica donde puede pedirle a Java que considere un número como sin firmar. No es para uso diario, pero es útil cuando lo necesitas. –

Respuesta

51

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

+14

Esta respuesta está un poco desactualizada (fue publicada en 2009). Al iniciar Java 8 (lanzado en marzo de 2014), existe soporte para long sin firmar. Verifique un ejemplo que publiqué a continuación como respuesta. – Amr

7

No, no lo hay. Los diseñadores de Java han declarado que no les gustaban las notas sin firmar. Use un BigInteger en su lugar. Ver this question para más detalles.

+19

Respeto a Gosling por lo que ha hecho, pero creo que su defensa de los no firmados es una de las excusas más tontas que he escuchado. :-) Tenemos waaaay cosas más wonky en Java que ints sin signo ... :-) –

+0

Gosling en JavaPolis 2007 dio un ejemplo que confusamente no funciona para ints sin signo. Josh Bloch señaló que tampoco funciona para los formularios firmados. ¡Enteros de tamaño arbitrario ftw! –

+21

No respeto a Gosling por lo que ha hecho. ¿Decir que las personas no entienden las matemáticas sin firmar? Las matemáticas firmadas son complejas, especialmente en el nivel de bits. No entiendo por qué las personas aman Java cuando fue escrito claramente para personas estúpidas (¿quizás es la broma más sutil de la informática?). –

12

No, no lo es. Tendrá que usar el tipo de datos primitivo long y tratar los problemas de firma, o usar una clase como BigInteger.

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.

+14

char es un valor de 16 bits sin signo;) –

+6

ARGH! Me atrapaste. Bien hecho, amigo – basszero

4

Según las operaciones que pretenda realizar, el resultado es muy similar, firmado o sin firmar. Sin embargo, a menos que esté usando operaciones triviales terminará usando BigInteger.

0

Parece que en Java 8 some methods are added a Largo para tratar el bien viejo [firmado] siempre que no esté firmado. Parece una solución alternativa, pero puede ayudar a veces.

4

Para firmar tiempo se puede utilizar UnsignedLong clase de Guava library:

Es compatible con varias operaciones:

  • más
  • menos
  • veces
  • mod
  • dividedBy

Lo que parece que falta en este momento son los operadores de cambio de byte. Si los necesita, puede usar BigInteger desde Java.

117

Al iniciar Java 8, se admite la longitud sin signo (64 bits sin signo).La forma en que se puede utilizar es:

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

imprimirlo, no se puede simplemente imprimir L1, pero hay que primero:

String l1Str = Long.toUnsignedString(l1) 

Entonces

System.out.println(l1Str); 
+0

¿Hay alguna manera de que podamos leer un largo sin firmar del Scanner – j10

+0

@ j10, 'Long ul1 = Long.parseUnsignedLong (objScannerInstance.next (" \\ d + "));' No exactamente elegante porque carece de un rango verificar, pero le permitiría obtener entradas numéricas largas que de otra manera serían posibles que excedan el rango de una longitud firmada. _ (Aprovecha el hecho de que 'Scanner :: next (...)' también puede aceptar un objeto Patrón o un patrón de Cadena.) _ – SpencerD

6

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

Y las adiciones, sustracciones y multiplicaciones son las mismas para los largos firmados y sin firmar.

+1

Una mirada rápida en el código fuente me dice que sea un poco cauteloso con estos métodos. Cuando los largos son de hecho negativos (es decir, hay una diferencia con respecto al caso firmado), 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

1

El paquete org.apache.axis.types tiene una clase UnsignedLong

.

de Maven:

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