2014-01-09 32 views
0

有人可以解释为什么Javascript给出以下结果吗?JavaScript中的否定

~3 = -4 
~3.346346 = -4 
~-3 = 2 
+0

看到和理解补:http://stackoverflow.com/questions/1049722/what-is-2s-complement的第一个 – Matt

+1

输出是也'2'。你似乎搞砸了你的例子。 – Stijn

+0

@Stijn不,给出的例子是正确的。 –

回答

3

~bitwise negation operator[MDN]

二进制(使用32位整数)3

0000 0000 0000 0000 0000 0000 0000 0011 (3) 

和二进制-3(使用two's complement)是

1111 1111 1111 1111 1111 1111 1111 1101 (-3) 

~操作者互换所有1 S的0 s和所有0 s到1,所以~3将是

1111 1111 1111 1111 1111 1111 1111 1100 (~3 == -4) 

这是二进制的-4(使用two's complement)。

同样,~-3

0000 0000 0000 0000 0000 0000 0000 0010 (~-3 == 2) 

是二进制为2

3.346346在执行按位运算时会被转换为整数,因此它将具有与3相同的结果。


综上所述:

3 = 0000 0000 0000 0000 0000 0000 0011 = (int)3.346346 
~3 = 1111 1111 1111 1111 1111 1111 1100 = -4 
-3 = 1111 1111 1111 1111 1111 1111 1101 
~-3 = 0000 0000 0000 0000 0000 0000 0010 = 2 
+0

非常好的回答,赞扬! – joseeight

0

这是因为负数被存储为

minusB = ~B + 1; 

在你的情况下,扭转上述公式:

  • -3存储为~3 + 1。因此,~-3相当于-(-3) - 1 = 2
  • ~3.346346先四舍五入至3,然后~3可以理解为-3 - 1 = -4

为什么使用(而不是使用符号的独立位)的原因,是它使减法和加法无关紧要,无关紧要。

相关问题