method - java static member
Declarar un int sin firmar en Java (11)
¿Hay una manera de declarar un int sin firmar en Java?
O la pregunta también se puede enmarcar como esta: ¿Cuál es el equivalente de Java de unsigned?
Solo para decirle el contexto que estaba viendo en la implementación de String.hashcode()
de String.hashcode()
. Quería probar la posibilidad de colisión si el entero fuera 32 int sin signo.
Acaba de crear este código, que convierte "this.altura" de un número negativo a uno 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);
}
Java no tiene enteros sin signo .
Puede definir un valor 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
long :
En Java SE 8 y versiones 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. Use la clase Integer para usar el tipo de datos int como un entero sin signo. 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 están firmadas cuando se declaran, pero ahora es posible una aritmética sin signo usando esos métodos en la clase Integer
.
Necesitamos números sin firmar para modelar MySQL sin firma SMALLINT
, SMALLINT
, INT
, BIGINT
en jOOQ , por lo que hemos creado jOOU , una biblioteca minimalista que ofrece tipos de envoltorio para números enteros sin firmar 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 extienden java.lang.Number
y se pueden convertir en tipos primitivos de orden superior y BigInteger
. Espero que esto ayude.
(Descargo de responsabilidad: trabajo para la empresa detrás de estas bibliotecas)
Para números sin firmar puede usar estas clases de la biblioteca de guayaba :
Soportan diversas operaciones:
- más
- menos
- veces
- mod
- dividido por
Lo que parece faltar en este momento son los operadores de cambio de bytes. Si los necesitas puedes usar BigInteger desde Java.
Parece que puede manejar el problema de firma haciendo un "AND lógico" en los valores antes de usarlos:
Ejemplo (el valor del header[0]
del byte[]
header[0]
es 0x86
):
System.out.println("Integer "+(int)header[0]+" = "+((int)header[0]&0xff));
Resultado:
Integer -122 = 134
Prueba esto:
private static int wb(int i){
// convert negative to positive
int unsigned = 0;
if (i<0){
unsigned = i + 256;
} else {
unsigned = i;
}
return unsigned;
}
Puede utilizar la función Math.abs (número). Devuelve un número positivo.
Si un valor en un int está firmado o sin firmar depende de cómo se interpretan los bits: Java interpreta los bits como un valor con signo (no tiene primitivos sin signo).
Si tiene un int que desea interpretar como un valor sin firmar (por ejemplo, si lee un int desde un DataInputStream que sabe que contiene un valor sin firmar), 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 largo literal, no un int int literal, de ahí la "l" al final.
Tal vez 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
Utilice char
para enteros sin signo de 16 bits.