Anyone knows why javascript Number.toString
function does not represents negative numbers correctly?
//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"
I am really curious why it doesn't work properly or what is the reason it works this way? I've searched it but didn't find anything that helps.
To use negative numbers, just place a minus (-) character before the number we want to turn into a negative value: let temperature = -42; What we've seen in this section makes up the bulk of how we will actually use numbers.
The first approach uses the Math. abs() method to convert the negative values to positive ones.
parseInt understands exactly two signs: + for positive, and - for negative.
The toString()
function takes the decimal, converts it to binary and adds a "-" sign.
A zero fill right shift converts it's operands to signed 32-bit integers in two complements format.
Question 1:
//If you try (-3).toString(2); //show "-11"
It's in the function .toString()
. When you output a number via .toString()
:
Syntax
numObj.toString([radix])
If the numObj is negative, the sign is preserved. This is the case even if the radix is 2; the string returned is the positive binary representation of the numObj preceded by a - sign, not the two's complement of the numObj.
It takes the decimal, converts it to binary and adds a "-" sign.
Question 2:
// but if you fake a bit shift operation it works as expected (-3 >>> 0).toString(2); // print "11111111111111111111111111111101"
A zero fill right shift converts it's operands to signed 32-bit integers. The result of that operation is always an unsigned 32-bit integer.
The operands of all bitwise operators are converted to signed 32-bit integers in two's complement format.
-3 >>> 0 (right logical shift) coerces its arguments to unsigned integers, which is why you get the 32-bit two's complement representation of -3.
http://en.wikipedia.org/wiki/Two%27s_complement
http://en.wikipedia.org/wiki/Logical_shift
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With