2017-06-29 53 views
4

任何人都可以解释:在JavaScript中,为什么~~ Infinity评估为0?

  • 为什么双位NOT为无限returns 0

    ~~Infinity //return 0 
    
  • 发生了什么?

  • 无穷大在JavaScript中的二进制表示是什么?

+5

不知道为什么双是相关的。 '〜Infinity'是'-1'。 –

+4

“JavaScript中无穷大的二进制表示是什么?” JS使用IEEE 754标准的浮点数,所以它将是(对于pos inifinity)0符号,指数的所有1和尾数将是0(js数字是64b,但是32b ieee754 inf将看起来像0 1111 1111 0000 0000 0000 0000 0000 000) –

+1

你会在这里找到一些信息 - > [双位NOT(~~)](https://j11y.io/cool-stuff/double-bitwise-not) –

回答

5

因为您没有在JavaScript中对数字的底层位模式进行操作。

你不能做以下的C代码的JavaScript中的等价物:

#include <inttypes.h> 
#include <math.h> 
#include <stdint.h> 
#include <stdio.h> 

int main(void) { 
    double x = HUGE_VAL; 
    uint64_t y = *((uint64_t *) &x); 
    printf("%016" PRIx64 "\n", y); 
    printf("%016" PRIx64 "\n", ~y); 
    printf("%016" PRIx64 "\n", ~~y); 
    return 0; 
} 

此打印:

7ff0000000000000 
800fffffffffffff 
7ff0000000000000 

由于MDN notes

位运算符对待他们[原文]操作数作为一组32位(零和1),而不是十进制,十六进制或八进制数字。 ...按位运算符对这些二进制表示执行操作,但它们返回标准的JavaScript数值。

...将最重要(最左边)位设置为1的值表示负数(二进制补码表示)。

11.4.8 in ES5,我们有:

11.4.8位非运算符(〜)

生产UnaryExpression : ~ UnaryExpression评估如下:

  • expr是评估结果为UnaryExpression
  • oldValueToInt32(GetValue(expr))
  • 返回对oldValue应用按位补码的结果。结果是一个有符号的32位整数。

ToInt32(Infinity) is +0。第一个~使其成为0xffffffff。第二个~将所有位翻转为零。

也就是说,它下面的C代码相当于:

#include <inttypes.h> 
#include <math.h> 
#include <stdio.h> 

int main(void) { 
    double x = HUGE_VAL; 
    uint32_t y = x; 
    printf("%08X\n", y); 
    printf("%08X\n", ~y); 
    printf("%08X\n", ~~y); 
    return 0; 
} 

输出:

00000000 
FFFFFFFF 
00000000 
相关问题