Existe-t-il un moyen de déclarer un int non signé en Java?
Ou la question peut être formulée ainsi: quel est l'équivalent Java de unsigned?
Juste pour vous dire le contexte dans lequel je regardais l'implémentation de Java String.hashcode()
. Je voulais tester la possibilité de collision si l'entier était 32 entier non signé.
>>>
opérateur au lieu de>>
.Réponses:
Java n'a pas de type de données pour les entiers non signés .
Vous pouvez définir un
long
au lieu d'unint
si vous avez besoin de stocker de grandes valeurs.Vous pouvez également utiliser un entier signé comme s'il n'était pas signé. L'avantage de la représentation du complément à deux est que la plupart des opérations (telles que l'addition, la soustraction, la multiplication et le décalage vers la gauche) sont identiques au niveau binaire pour les entiers signés et non signés. Cependant, quelques opérations (division, décalage à droite, comparaison et coulée) sont différentes. Depuis Java SE 8, les nouvelles méthodes de la
Integer
classe vous permettent d'utiliser pleinement leint
type de données pour effectuer une arithmétique non signée :Notez que les
int
variables sont toujours signées lorsqu'elles sont déclarées mais l'arithmétique non signée est désormais possible en utilisant ces méthodes dans laInteger
classe.la source
int
type de données pour représenter un entier 32 bits non signé, qui a une valeur minimale de0
et une valeur maximale de2^32-1
. - voir docs.oracle.com/javase/tutorial/java/nutsandbolts/… et docs.oracle.com/javase/8/docs/api/java/lang/Integer.htmlint
comme s'il n'était pas signé en utilisant diverses méthodes.Il existe une API pour Integer et Long non signé dans Java 8!
la source
Integer
classe de Java 8 permet d'utiliser un entier non signé, il y a la différence entre l'espace et la vitesse (car en C / C ++, ils sont primitifs, tandis qu'en Java, c'est un wrapper d'objet entier)int
les roll-over, même s'ils sont signés. C'est C / C ++ où le non signé est retourné, mais le signé provoque un «comportement indéfini» en cas de débordement. Si le «roulement» est votre seule préoccupation, vous n'avez pas besoin de non signé. Je suppose que c'est pourquoi les routines CRC, etc. fonctionnent en Java sans efforts supplémentaires. Et c'est pourquoi la nouvelle API ajoute uniquement l'analyse, le formatage, les comparaisons, la division et le reste. Toutes les autres opérations, à savoir toutes les manipulations de bits, mais aussi l'addition, la soustraction, la multiplication, etc. font de toute façon la bonne chose.Le fait qu'une valeur dans un entier soit signée ou non 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 souhaitez interpréter comme une valeur non signée (par exemple, vous lisez un int à partir d'un DataInputStream dont vous savez qu'il contient une valeur non signée), vous pouvez effectuer l'astuce suivante.
Notez qu'il est important que le littéral hexadécimal soit un long littéral, pas un littéral int - d'où le «l» à la fin.
la source
0xFFFFFF
et garder l'int?Nous avions besoin d'un nombre non signés modèle non signé de MySQL
TINYINT
,SMALLINT
,INT
,BIGINT
dans jOOQ , ce qui est la raison pour laquelle nous avons créé jOOU , une offre bibliothèque wrapper types pour minimalistic nombres entiers non signés en Java. Exemple:Tous ces types s'étendent
java.lang.Number
et peuvent être convertis en types primitifs d'ordre supérieur etBigInteger
. J'espère que cela t'aides.(Avertissement: je travaille pour l'entreprise derrière ces bibliothèques)
la source
Pour les numéros non signés, vous pouvez utiliser ces classes de la bibliothèque Guava :
Ils prennent en charge diverses opérations:
Ce qui semble manquer pour le moment, ce sont les opérateurs de décalage d'octet. Si vous en avez besoin, vous pouvez utiliser BigInteger de Java.
la source
À utiliser
char
pour les entiers non signés 16 bits.la source
C'est peut-être ce que vous vouliez dire?
getUnsigned(0)
→ 0getUnsigned(1)
→ 1getUnsigned(Integer.MAX_VALUE)
→ 2147483647getUnsigned(Integer.MIN_VALUE)
→ 2147483648getUnsigned(Integer.MIN_VALUE + 1)
→ 2147483649la source
2 * (long) Integer.MAX_VALUE + 2
c'est plus facile à comprendre que0x1_0000_0000L
? À cet égard, pourquoi pas simplementreturn signed & 0xFFFF_FFFFL;
?Il semble que vous pouvez gérer le problème de signature en effectuant un "ET logique" sur les valeurs avant de les utiliser:
Exemple (la valeur de
byte[]
header[0]
est0x86
):Résultat:
la source
Il y a de bonnes réponses ici, mais je ne vois aucune démonstration d'opérations au niveau du bit. Comme Visser (la réponse actuellement acceptée) le dit, Java signe des entiers par défaut (Java 8 a des entiers non signés, mais je ne les ai jamais utilisés). Sans plus tarder, faisons-le ...
Exemple RFC 868
Que se passe-t-il si vous devez écrire un entier non signé dans IO? Un exemple pratique est lorsque vous souhaitez sortir l'heure conformément à la RFC 868 . Cela nécessite un entier non signé 32 bits, big-endian, qui code le nombre de secondes depuis le 1er janvier 1900 à 00h00. Comment encoderiez-vous cela?
Créez votre propre entier 32 bits non signé comme ceci:
Déclarez un tableau d'octets de 4 octets (32 bits)
Cela initialise le tableau, voir Les tableaux d'octets sont - ils initialisés à zéro en Java? . Vous devez maintenant remplir chaque octet du tableau avec des informations dans l'ordre big-endian (ou little-endian si vous voulez faire des ravages). En supposant que vous ayez un long contenant l'heure (les entiers longs ont 64 bits de long en Java) appelé
secondsSince1900
(qui n'utilise que les 32 premiers bits, et que vous avez géré le fait que la date fait référence à 00h00 le 1er janvier 1970), alors vous pouvez utiliser le ET logique pour en extraire des bits et les déplacer dans des positions (chiffres) qui ne seront pas ignorées lors de la compression dans un octet, et dans l'ordre big-endian.Notre
my32BitUnsignedInteger
est maintenant équivalent à un entier non signé de 32 bits, big-endian, conforme à la norme RCF 868. Oui, le type de données long est signé, mais nous avons ignoré ce fait, car nous avons supposé que le secondsSince1900 n'utilisait que les 32 bits inférieurs). En raison de la conversion du long en octet, tous les bits supérieurs à 2 ^ 7 (les deux premiers chiffres en hexadécimal) seront ignorés.Source référencée: Java Network Programming, 4th Edition.
la source
Je viens de faire ce morceau de code, qui convertit "this.altura" du nombre négatif en nombre positif. J'espère que cela aide quelqu'un dans le besoin
la source
Vous pouvez utiliser la fonction Math.abs (nombre). Il renvoie un nombre positif.
la source
MIN_VALUE
0