Déclaration d’un int non signé en Java

Est-il possible de déclarer un int non signé en Java?

Ou la question peut être formulée ainsi: Qu’est-ce que l’équivalent Java de unsigned?

Juste pour vous dire le contexte, je regardais l’implémentation Java de Ssortingng.hashcode() . Je voulais tester la possibilité de collision si le nombre entier était de 32 unsigned int.

Java n’a pas d’ entiers non signés .

Vous pouvez définir un long au lieu d’un int si vous avez besoin de stocker de grandes valeurs, mais il est impossible d’exclure les valeurs négatives.

Cependant, à partir de Java SE 8, il existe quelques nouvelles méthodes dans la classe Integer qui vous permettent d’utiliser le type de données int pour effectuer des calculs arithmétiques non signés :

Dans Java SE 8 et versions ultérieures, vous pouvez utiliser le type de données int pour représenter un entier non signé de 32 bits, qui a une valeur minimale de 0 et une valeur maximale de 2 ^ 32-1. Utilisez la classe Integer pour utiliser le type de données int en tant qu’entier non signé. Des méthodes statiques comme compareUnsigned , divideUnsigned etc. ont été ajoutées à la classe Integer pour prendre en charge les opérations arithmétiques pour les entiers non signés.

Notez que les variables int sont toujours signées lorsqu’elles sont déclarées mais que l’arithmétique non signée est désormais possible en utilisant ces méthodes dans la classe Integer .

Il existe une API pour les entiers non signés et longs dans Java 8!

Si une valeur dans un int est signée ou non signée dépend de la façon dont les bits sont interprétés – Java interprète les bits comme une valeur signée (il n’a pas de primitives non signées).

Si vous avez un int que vous voulez interpréter comme une valeur non signée (par exemple, vous lisez un int à partir d’un DataInputStream qui contient une valeur non signée), vous pouvez réaliser l’astuce suivante.

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

Notez qu’il est important que le littéral hexadécimal soit un littéral long, pas un littéral int – d’où le «l» à la fin.

Nous avions besoin de nombres non signés pour modéliser les TINYINT , SMALLINT , INT et BIGINT non signés de MySQL dans jOOQ . C’est pourquoi nous avons créé jOOU , une bibliothèque minimaliste proposant des types d’encapsulation pour les nombres entiers non signés en Java. Exemple:

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

Tous ces types étendent java.lang.Number et peuvent être convertis en types primitifs d’ordre supérieur et BigInteger . J’espère que cela t’aides.

(Disclaimer: Je travaille pour l’entreprise derrière ces bibliothèques)

Pour les nombres non signés, vous pouvez utiliser ces classes de la bibliothèque Guava :

  • UnsignedInteger
  • UnsignedLong

Ils supportent diverses opérations:

  • plus
  • moins
  • fois
  • mod
  • divisé par

Ce qui semble manquer pour le moment, ce sont les opérateurs de décalage en octets. Si vous en avez besoin, vous pouvez utiliser BigInteger de Java.

Utilisez char pour les entiers non signés 16 bits.

C’est peut-être ce que tu voulais dire?

 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

Je viens de faire ce morceau de code, qui convertit “this.altura” de négatif en nombre positif. J’espère que cela aide quelqu’un dans le besoin

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

Vous pouvez utiliser la fonction Math.abs (nombre). Il renvoie un nombre positif.