Declarando una int sin firmar en Java

¿Hay alguna forma de declarar un int sin firmar en Java?

O la pregunta también puede enmarcarse así: ¿Cuál es el equivalente Java de unsigned?

Solo para contarte el contexto que estaba viendo, la implementación de Java de String.hashcode() . Quería probar la posibilidad de colisión si el entero fuera 32 int sin firmar.

Java no tiene enteros sin signo .

Puede definir un long lugar de un int si necesita almacenar valores grandes, pero no hay manera de excluir valores negativos.

Sin embargo, a partir de Java SE 8, hay algunos métodos nuevos en la clase Integer que le permiten usar el tipo de datos int para realizar aritmética sin signo :

En Java SE 8 y posteriores, puede usar el tipo de datos int para representar un entero de 32 bits sin signo, que tiene un valor mínimo de 0 y un valor máximo de 2 ^ 32-1. Utilice la clase Integer para usar el tipo de datos int como un entero sin signo. Los métodos estáticos como compareUnsigned , compareUnsigned , etc. se han agregado a la clase Integer para admitir las operaciones aritméticas para enteros sin signo.

Tenga en cuenta que las variables int todavía se firman cuando se declara, pero la aritmética sin signo ahora es posible utilizando esos métodos en la clase Integer .

¡Hay una API para Integer sin signo y Long en Java 8!

Si un valor en un int está firmado o no, depende de cómo se interpretan los bits: Java interpreta los bits como un valor con signo (no tiene primitivas sin signo).

Si tiene un int que desea interpretar como un valor sin signo (por ejemplo, lee un int de un DataInputStream que sabe que contiene un valor sin signo), puede hacer el siguiente truco.

 int fourBytesIJustRead = someObject.getInt(); long unsignedValue = fourBytesIJustRead & 0xffffffffl; 

Tenga en cuenta que es importante que el literal hexadecimal sea un literal largo, no un literal int, de ahí la ‘l’ al final.

Necesitábamos números sin signo para modelar SMALLINT , SMALLINT , INT , BIGINT sin TINYINT MySQL en jOOQ , por lo que hemos creado jOOU , una biblioteca minimalista que ofrece tipos de contenedor para números enteros sin signo en Java. Ejemplo:

 import static org.joou.Unsigned.*; // and then... UByte b = ubyte(1); UShort s = ushort(1); UInteger i = uint(1); ULong l = ulong(1); 

Todos estos tipos amplían java.lang.Number y se pueden convertir en tipos de primitiva de orden superior y BigInteger . Espero que esto ayude.

(Descargo de responsabilidad: yo trabajo para la compañía detrás de estas bibliotecas)

Para números sin firmar, puede usar estas clases de la biblioteca de Guava :

  • UnsignedInteger
  • UnsignedLong

Son compatibles con diversas operaciones:

  • más
  • menos
  • veces
  • mod
  • dividido por

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

Use char para enteros sin signo de 16 bits.

Quizás esto es lo que quisiste decir?

 long getUnsigned(int signed) { return signed >= 0 ? signed : 2 * (long) Integer.MAX_VALUE + 2 + signed; } 
  • getUnsigned(0) → 0
  • getUnsigned(1) → 1
  • getUnsigned(Integer.MAX_VALUE) → 2147483647
  • getUnsigned(Integer.MIN_VALUE) → 2147483648
  • getUnsigned(Integer.MIN_VALUE + 1) → 2147483649

Acabo de hacer esta pieza de código, que convierte “this.altura” de número negativo a positivo. Espero que esto ayude a alguien en necesidad

  if(this.altura < 0){ String aux = Integer.toString(this.altura); char aux2[] = aux.toCharArray(); aux = ""; for(int con = 1; con < aux2.length; con++){ aux += aux2[con]; } this.altura = Integer.parseInt(aux); System.out.println("New Value: " + this.altura); } 

Puede usar la función Math.abs (number). Devuelve un número positivo.