61

javascriptNumber.toString関数が負の数を正しく表現しない理由を知っている人はいますか?

//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"

なぜ正しく動作しないのか、またはこのように動作する理由は何なのか、非常に興味があります。私はそれを検索しましたが、役立つものは何も見つかりませんでした。

4

6 に答える 6

30

簡潔な答え:

  1. 関数は 10 進数を受け取り、toString()それを 2 進数に変換し、「-」記号を追加します。

  2. ゼロ フィル右シフトは、そのオペランドを 2 の補数形式の符号付き 32 ビット整数に変換します。

より詳細な答え:

質問1:

//If you try
(-3).toString(2); //show "-11"

関数にあります.toString()。を介して数値を出力する場合.toString()

構文

numObj.toString([基数])

numObj が負の場合、符号は保持されます。これは、基数が 2 の場合でも当てはまります。返される文字列は、numObj の 2 の補数ではなく、- 記号が前に付いた numObj の正のバイナリ表現です。

10 進数を 2 進数に変換し、「-」記号を追加します。

  1. 10進数の「3」を2進数に換算すると「11」
  2. 記号を追加すると、「-11」が得られます

質問2:

// but if you fake a bit shift operation it works as expected
        (-3 >>> 0).toString(2); // print "11111111111111111111111111111101"

ゼロ フィル右シフトは、オペランドを符号付き 32 ビット整数に変換します。その演算の結果は、常に符号なし 32 ビット整数です。

すべてのビット演算子のオペランドは、2 の補数形式の符号付き 32 ビット整数に変換されます。

于 2016-06-07T15:11:44.850 に答える
21
var binary = (-3 >>> 0).toString(2); // coerced to uint32

console.log(binary);

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

jsfiddle

出力は

11111111111111111111111111111101
-3 
于 2013-04-22T20:01:36.057 に答える