Nombres négatifs vers chaîne binaire en JavaScript
Quelqu'un sait pourquoi la fonction javascript Number.toString
ne représente pas correctement les nombres négatifs?
//If you try
(-3).toString(2); //shows "-11"
// but if you fake a bit shift operation it works as expected
(-3 >>> 0).toString(2); // print "11111111111111111111111111111101"
je suis vraiment curieux de savoir pourquoi il ne fonctionne pas correctement ou Quelle est la raison pour laquelle il fonctionne de cette façon? Je l'ai cherché, mais je n'ai rien trouvé qui puisse aider.
3 réponses
-3 >>> 0 (déplacement logique à droite) coerce ses arguments avec des entiers non signés, c'est pourquoi vous obtenez la représentation de complément de 32 bits de -3.
courte réponse:
-
la fonction
toString()
prend la décimale, la convertit binaire et ajoute un signe" -". -
Un zéro de remplissage décalage à droite convertit l'opérande de signé 32 bits entier dans le format de deux compléments.
une réponse plus détaillée:
Question 1:
//If you try
(-3).toString(2); //show "-11"
C'est dans la fonction .toString()
. Lorsque vous produisez un nombre via .toString()
:
syntaxe
numObj.toString ([radix])
si le chiffre est négatif, le signe est conservé. C'est le cas même si le radix est 2; la chaîne retournée est le binaire positif la représentation de la numObj précédé de A-signe, pas les deux complément du numObj.
donc en gros il prend la décimale, la convertit en binaire et ajoute un signe" -".
- Base 10" 3 "convertie en base 2 est "11"
- Ajouter un signe nous donne "-11"
Question 2:
// but if you fake a bit shift operation it works as expected
(-3 >>> 0).toString(2); // print "11111111111111111111111111111101"
un ZERO fill à droite convertit son fonctionnement à un 32 bit entier signé .
les opérandes de tous les opérateurs bitwise sont converties en 32 bits signés les entiers dans le format de complément de deux.