Dichiarare un int unsigned in Java

C’è un modo per dichiarare un int unsigned in Java?

Oppure la domanda potrebbe essere formulata anche in questo modo: qual è l’equivalente Java di unsigned?

Solo per dirvi il contesto stavo guardando all’implementazione di Java di String.hashcode() . Volevo testare la possibilità di collisione se il numero intero fosse 32 int non firmato.

Java non ha numeri interi senza segno .

È ansible definire un long invece di un int se è necessario memorizzare valori grandi ma non è ansible escludere valori negativi.

Tuttavia, a partire da Java SE 8, ci sono alcuni nuovi metodi nella class Integer che consentono di utilizzare il tipo di dati int per eseguire operazioni aritmetiche senza segno :

In Java SE 8 e versioni successive, è ansible utilizzare il tipo di dati int per rappresentare un numero intero a 32 bit senza segno, che ha un valore minimo di 0 e un valore massimo di 2 ^ 32-1. Utilizzare la class Integer per utilizzare il tipo di dati int come un numero intero senza segno. Metodi statici come compareUnsigned , divideUnsigned ecc. Sono stati aggiunti alla class Integer per supportare le operazioni aritmetiche per interi senza segno.

Si noti che le variabili int sono ancora firmate quando l’aritmetica dichiarata ma non firmata è ora ansible utilizzando questi metodi nella class Integer .

C’è un’API per interi senza segno e Long in Java 8!

Se un valore in un int è firmato o non firmato dipende da come vengono interpretati i bit – Java interpreta i bit come un valore con segno (non ha primitive senza segno).

Se si ha un int che si vuole interpretare come un valore non firmato (ad es. Si legge un int da un DataInputStream che si conosce contiene un valore senza segno), allora si può fare il seguente trucco.

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

Nota che è importante che il letterale esadecimale sia letterale lungo, non int letterale – da qui la ‘l’ alla fine.

Avevamo bisogno di numeri non firmati per modellare MySQL TINYINT , SMALLINT , INT , BIGINT in jOOQ , ed è per questo che abbiamo creato jOOU , una libreria minimalista che offre tipi di wrapper per numeri interi senza segno in Java. Esempio:

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

Tutti questi tipi estendono java.lang.Number e possono essere convertiti in tipi primitivi di ordine superiore e BigInteger . Spero che questo ti aiuti.

(Disclaimer: lavoro per la compagnia dietro queste librerie)

Per i numeri non firmati è ansible utilizzare queste classi dalla libreria Guava :

  • UnsignedInteger
  • unsignedLong

Supportano varie operazioni:

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

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

Usa char per interi senza char a 16 bit.

Forse è questo che intendevi?

 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

Ho appena realizzato questo pezzo di codice, che converte “this.altura” dal numero negativo a quello positivo. Spero che questo aiuti qualcuno che ha bisogno

  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); } 

È ansible utilizzare la funzione Math.abs (numero). Restituisce un numero positivo.