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.

39
demandé sur fernandosavio 2013-04-22 23:56:47

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.

http://en.wikipedia.org/wiki/Two%27s_complement

http://en.wikipedia.org/wiki/Logical_shift

25
répondu Steve Wang 2013-04-22 19:59:27
var binary = (-3 >>> 0).toString(2); // coerced to uint32

console.log(binary);

console.log(parseInt(binary, 2) >> 0); // to int32

sur jsfiddle

sortie est

11111111111111111111111111111101
-3 
16
répondu Xotic750 2013-04-22 20:01:36

courte réponse:

  1. la fonction toString() prend la décimale, la convertit binaire et ajoute un signe" -".

  2. 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" -".

  1. Base 10" 3 "convertie en base 2 est "11"
  2. 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.

12
répondu Daan 2016-06-07 15:11:44