[Java] Considérations lors de la gestion des nombres binaires négatifs avec Integer.parseInt ()

Environnement d'exploitation

Java11

Contenu

Ce n'est pas un gros problème, alors je vais tout à coup entrer dans le sujet principal.

En Java, les nombres négatifs sont représentés en interne par le complément de 2. Vous pouvez utiliser Integer.toBinaryString () pour obtenir une chaîne avec une représentation interne.

Dans le cas d'un nombre binaire, le complément de 2 est le nombre obtenu en inversant tous les bits puis en ajoutant 1. Puisque le nombre décimal 15 est 1111 dans le nombre binaire, le nombre décimal -15 est la valeur suivante.

System.out.println(Integer.toBinaryString(-15))  // 11111111111111111111111111110001

Cependant, passer cette valeur à Integer.parseInt () entraînera une erreur.

Integer.parseInt(Integer.toBinaryString(-15), 2)
//Exception java.lang.NumberFormatException: For input string: "11111111111111111111111111110001"
//        at NumberFormatException.forInputString (NumberFormatException.java:65)
//        at Integer.parseInt (Integer.java:652)
//        at (#9:1)

Apparemment, vous devez passer Integer.parseInt () sous la forme d'un nombre binaire positif avec un signe négatif, plutôt que la valeur de la représentation interne du complément 2.

System.out.println(Integer.parseInt("-1111", 2))  // -15

c'est tout.

PostScript 2019/3/4 Vous en avez souligné certains dans les commentaires.

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Integer.html#toBinaryString-int-

Renvoie la représentation sous forme de chaîne de l'argument entier sous la forme d'un entier non signé de base 2. La valeur int non signée est l'argument plus 2 ^ 32 si l'argument est un nombre négatif.

(La partie qui devient 232 lorsqu'elle est copiée telle quelle est corrigée à 2 ^ 32)

Il a été déclaré que si l'argument est une valeur négative, une représentation interne du complément 2 est renvoyée, mais le document officiel semble avoir la description ci-dessus. Cependant, le résultat est le même. Je l'ai vérifié en utilisant Ruby. (Parce que Java déborde et est gênant)

Tout d'abord, la valeur de retour de Integer.toBinaryString () de Java

System.out.println(Integer.toBinaryString(-15));  // 11111111111111111111111111110001

Représentation binaire de la valeur de l'argument (-15) plus 2 ^ 32

n = -15 + 2 ** 32
puts(n.to_s(2))   # 11111111111111111111111111110001

Il a été confirmé que les deux sont devenus 11111111111111111111111111110001.

En outre, il semble y avoir une méthode appelée Integer.parseUnsignedInt () qui peut analyser ce nombre binaire interne tel quel.

System.out.println(Integer.parseUnsignedInt(Integer.toBinaryString(-15), 2));  // -15

Merci d'avoir souligné. (C'est une histoire de lecture du document officiel en premier lieu ...)

Recommended Posts

[Java] Considérations lors de la gestion des nombres binaires négatifs avec Integer.parseInt ()
Erreur lors de la lecture avec java
Remarques sur la communication HTTP avec Java (OkHttp)
Lors de l'appel de l'API avec java, javax.net.ssl.SSLHandshakeException se produit
[Java] Précautions lors de la comparaison de chaînes de caractères avec des chaînes de caractères
Spécifiez ClassPath lors de l'utilisation de jupyter + Java avec WSL
Refactoriser la gestion des accès aux propriétés avec Java Method Util
[Java] Trouvez le nombre premier avec le tamis Eratostenes
Distinguer les nombres positifs et négatifs en Java
Créons une application TODO en Java 11 Gestion des exceptions lors de l'accès à un TODO avec un ID inexistant