La conversion de binaire de 32 bits de la chaîne avec Entier.parseInt échoue
Pourquoi cette partie de code de l'échec:
Integer.parseInt("11000000000000000000000000000000",2);
Exception in thread "main" java.lang.NumberFormatException: For input string: "11000000000000000000000000000000"
Autant je comprends Entier est une valeur 32 bits. Le nombre de zéros et de uns dans la partie supérieure de code est de 32. Si il y a 31 le code fonctionne. Pourquoi donc?
La accepté de répondre ici n'est pas correct. La même question avec les réponses correctes peuvent être trouvés ici: Java Long.analyser une Chaîne binaire
OriginalL'auteur Aliens | 2012-01-17
Vous devez vous connecter pour publier un commentaire.
Votre code ne fonctionne pas car il essaie d'analyser un certain nombre qui exigerait de 33 bits pour stocker un entier signé.
Signé
int
est une valeur 32 bits en complément à deux de la représentation, où le premier bit indique le signe du nombre, et les 31 autres bits de la valeur du nombre. (-ish.) Java prend en charge uniquement les entiers signés, etparseInt()
et les amis ne sont pas censés analyser en complément à deux modèles de bits et donc interpréter la1
ou (peut-être implicite)0
à la 32e position à partir de la droite, comme le signe. Ils sont destinés à l'appui de l'analyse d'un lisible par l'homme reprentation, qui est une option-
(ou+
) pour le signe, suivi par la valeur absolue d'un nombre.Dans ce contexte, il est une fausse intuition qui vous mène à attendre le comportement que vous décrivez: si vous étiez l'analyse tout autres de base en plus de la base 2 (ou peut-être les autres couramment utilisés en puissance de deux bases), vous vous attendriez à ce que le premier chiffre de l'entrée à affecter le signe? Évidemment, vous ne serait pas, avoir, dire,
parseInt("2147483648")
retour-2147483648
par la conception serait PHP niveaux de fou.Spécial-boîtier en puissance de deux bases aussi se sent bizarre. Mieux d'avoir une approche à la gestion des modèles de bits, par exemple celui de cette réponse.
analyse négative des nombres binaires, si vous passez dans comme, disons, "-10010110". Il permettra également d'analyser une chaîne de 55 zéros, parce que c'est une valeur valide pour une
int
. Un nombre de 32 bits sans zéros n'est pas valideint
valeur, et il est donc rejetée.Ce que je voulais dire par "ne pas analyser les motifs de bits", c'est que ce `Entier.parseInt(str, 2)" l'analyse est un nombre écrit en base 2. Il n'analyse pas un stringified en complément à deux représentation binaire d'un entier de 32 bits. Je ne considère pas ce un bug, je viens de le considérer quelque chose de la méthode n'est pas prévu pour ce qui est de l'analyse "humaine" des représentations textuelles de nombres dans des bases arbitraires.
Hmm, je ne pense pas que 55 zéros travaillé. Merci pour le test! Je pense qu'il est étrange que 55 0s œuvres et 32 1s ne le font pas, mais c'est la façon dont il est.
Java représente des entiers dans 2-complément de, pas de signe de grandeur.
OriginalL'auteur millimoose
Selon la docs, la valeur maximale d'un Entier est
2^31-1
. Qui, dans le système binaire est:1111111111111111111111111111111
En d'autres termes, 31
1
's dans une rangée.OriginalL'auteur Mike Christensen
C'est parce que pour Entier.parseInt "11000000000000000000000000000000" n'est pas un complément à deux de la représentation de -1073741824 mais une valeur positive 3221225472 qui ne rentre pas dans les valeurs int gamme de -2147483648 à 2147483647. Mais nous pouvons analyser en complément à deux chaîne binaire de représentation avec BigInteger:
cette donne devrait -1073741824 résultat
OriginalL'auteur Evgeniy Dorofeev
Même si votre chaîne, "11.....beaucoup de zéros" juridique est une représentation binaire d'un entier négatif, Entier.parseInt() échoue. Je considère cela comme un bug.
L'ajout d'un peu de légèreté, en relisant ce post, il semble trop pédant, je comprends que l'Oracle n'a probablement pas beaucoup de soins si je pense que c'est un bug ou pas. 🙂
Vous pouvez essayer:
vous devriez voir
3221225472 -> -1073741824
Parfois, vous avez à faire cela avec des Couleurs en fonction de la façon dont ils sont stockés en tant que texte.
BTW, exactement ce qui peut arriver si vous êtes l'analyse d'une représentation Hexadécimale et vous êtes de l'analyse d'un nombre négatif comme "88888888". Vous avez besoin d'utiliser de Longs.parseLong() puis de les convertir.
parseInt()
, vous devez avoir un fichier ASCII moins-
au début de la Chaîne. Un coup d'oeil à cette question: Java Long.analyser une Chaîne binaireOriginalL'auteur user949300