Le fait de déclarer un unsigned int en Java
Est-il un moyen de déclarer un unsigned int en Java?
Ou la question peut être formulée comme ceci:
Qu'est-ce que Java équivalent de non signé?
Juste pour vous dire le contexte, j'ai été à la recherche à la Java de la mise en œuvre de String.hashcode()
. J'ai voulu tester la possibilité de collision si le nombre entier de 32 unsigned int.
- Il n'y a pas non signé types en Java.
- Ce poste peut vous aider stackoverflow.com/a/4449161/778687
- Voir ici: stackoverflow.com/questions/1841461/unsigned-short-in-java
- Bonne question, mais avez-vous essayé google tout?
- Ne semble pas être un moyen AFAICT. Connexes: stackoverflow.com/questions/430346/...
- Ici est le premier lien qui apparaît après googler "Unsigned Équivalent de int en Java" . Bien que,à sa connaissance commune que Java a chuté unsigned pour éviter confusiom.Essayer de googler premier.J'espère que le lien aide.
- Il serait mieux si vous fournir un échantillon au lieu de simplement donner un lien
- Il dépend de l'objectif que vous essayez d'atteindre. Pour la plupart des fins, tous les entiers en Java sont signés. Cependant, vous pouvez traiter un signé entier non signé dans un cas spécifique: vous pouvez décalage à droite, sans signe d'étendre en utilisant
>>>
opérateur au lieu de>>
. - Java est venue à allown
unsigned
en Java SE 8 - Bon de savoir qu'il ya des options pour faire des shifts logiques et, au lieu de seulement l'arithmétique ceux. Encore, Java rend difficile de gérer les formats de fichiers spécialisés ou seulement ceux des décennies.
- N'oubliez pas 'char'. C'est un 16 bits entier non signé. Peut même être utilisé comme un index de tableau. Juste besoin de transtypage à (int) à imprimer en nombre au lieu de caractère.
- J'ai essayé google et cette question est la première conséquence 🙂 DONC, est victime de son propre succès
- stackoverflow.com/a/397997/49246
- Voir aussi Comment utiliser l'Entier non signé en Java 8 et Java 9?
Vous devez vous connecter pour publier un commentaire.
Java ne dispose pas d'un type de données pour des entiers non signés.
Vous pouvez définir un
long
au lieu d'uneint
si vous avez besoin de stocker de grandes valeurs.Vous pouvez également utiliser un entier signé, comme si il ont été signés. L'avantage de en complément à deux de la représentation est que la plupart des opérations (telles que l'addition, la soustraction, la multiplication, et le virage à gauche) sont identiques sur un niveau binaire pour les entiers signés et non signés. Quelques opérations (division, décalage à droite, la comparaison et de la coulée), cependant, sont différents. Comme de Java SE 8, de nouvelles méthodes dans le
Integer
classe vous permettent d'utiliser pleinement leint
type de données pour effectuer arithmétique non signée:Noter que
int
variables sont encore signé déclarés mais non signé arithmétique est maintenant possible par l'utilisation de ces méthodes dans leInteger
classe.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 si il ont été signés par l'aide de diverses méthodes.Integer
classe en Java 8 permet d'utiliser unsigned int, est la différence entre simplement dans l'espace et de la vitesse (car en C/C++, ils sont primitifs, alors qu'en Java, c'est tout un objet wrapper)int
en Java est un type primitif. Les méthodes d'utilisation de ces valeurs primitives non signés sont situés dans la classeInteger
, mais cela ne signifie pas que vous devezInteger
objets (ces méthodes sontstatic
).Il y a un API pour les unsigned Integer et Long en Java 8!
Integer
classe en Java 8 permet d'utiliser unsigned int, est la différence entre simplement dans l'espace et de la vitesse (car en C/C++, ils sont primitifs, alors qu'en Java, c'est tout un objet wrapper)int
s roll over, même si elles sont signées. C'est C/C++ où unsigned roule, mais signé causes “un Comportement Indéfini” sur le dépassement. Si “rolling” est votre seule préoccupation, vous n'avez pas besoin non signé. Je suppose, c'est pourquoi CRC routines, etc. travail en Java sans efforts supplémentaires. Et c'est pourquoi la nouvelle API ajoute de l'analyse, mise en forme, de comparaisons, de diviser et de reste. Toutes les autres opérations, à savoir tous les bits de la manipulation, mais aussi l'addition, la soustraction, la multiplication, etc. faites la bonne chose, de toute façon.long
s non signés (assurez-vous qu'ils roulent plus à partir de 0). Il semble qu'il ne peut pas vraiment faire ...Si une valeur dans un int est signé ou non signé dépend de la façon dont les bits sont interprétés - Java interprète bits comme une valeur signée (il ne doit pas non signé primitives).
Si vous avez un int ce que vous voulez interpréter comme une valeur non signée (par exemple, vous lisez un int à partir d'un DataInputStream que vous savez contient une valeur non signée), alors vous pouvez faire le tour suivant.
Noter qu'il est important que l'hex littéral est une longue littérale, pas un entier littéral - d'où le " l " à la fin.
Nous avons besoin non signé numéros de modèle de MySQL unsigned
TINYINT
,SMALLINT
,INT
,BIGINT
dans jOOQ, c'est pourquoi nous avons créé jOOU, un minimaliste bibliothèque de types wrapper pour les nombres entiers en Java. Exemple:Tous ces types d'étendre
java.lang.Number
et peut être converti en un ordre supérieur de type primitif etBigInteger
. Espérons que cette aide.(Disclaimer: je travaille pour la société à l'origine de ces bibliothèques)
Pour les numéros, vous pouvez utiliser ces classes de Goyave bibliothèque:
Ils soutiennent les diverses opérations:
La chose qui semble manquer le moment, ce sont les octets d'opérateurs de décalage. Si vous avez besoin de ces vous pouvez utiliser BigInteger à partir de Java.
Utilisation
char
de 16 bits entiers non signés.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)
→ 21474836492 * (long) Integer.MAX_VALUE + 2
est plus facile à comprendre que0x1_0000_0000L
? À cet égard, pourquoi ne pas simplementreturn signed & 0xFFFF_FFFFL;
?Il semble que vous pouvez gérer la signature du problème en faisant un "ET logique" sur les valeurs avant de les utiliser:
Exemple (Valeur de
byte[]
header[0]
est0x86
):Résultat:
Vous pouvez utiliser les Mathématiques.abs(nombre) de la fonction. Elle renvoie un nombre positif.
MIN_VALUE
0