在JavaScript中,为什么~~Infinity的值会被计算为0?

4
有人能解释一下吗:
  • why double bitwise NOT for Infinity returns 0?

    ~~Infinity //return 0
    
  • what happens under the hood?

  • what is the binary representation of Infinity in javascript?


5
不确定为什么这里需要使用双精度浮点数。~Infinity等于-1 - Evan Trimboli
4
JavaScript使用IEEE 754标准表示浮点数,因此正无穷大的二进制表示为0作为符号位,指数部分全为1,尾数部分为0。(JavaScript数字是64位的,但一个32位的IEEE 754正无穷大看起来像是0 1111 1111 0000 0000 0000 0000 0000 000)。 - Patrick Barr
1
你可以在这里找到一些信息 -> 双重位取反符号(~~) - Roshana Pitigala
1
根据ES5 Section 4.3.22的规定,Infinity并没有明确说明它使用IEEE754标准(就像NaN一样),但是根据11.4.8~中使用了ToInt32,而在9.5中描述了NaN、+0、-0、+inf或-inf被转换为+0 - Patrick Barr
可能是 How ~(tilde)Infinity becomes -1 的重复问题。 - Sinan Ünür
1个回答

6

因为JavaScript不操作数字的底层位模式。

你不能在JavaScript中执行以下C代码的等效操作:

#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笔记 所述:

按位运算符将其操作数视为一组32位(零和一)而不是十进制、十六进制或八进制数字。... 按位运算符在这些二进制表示上执行其操作,但返回标准的JavaScript数值。

... 最高有效位(最左侧)设置为 1 的值表示负数(二进制补码表示)。

根据 ES5中的11.4.8,我们有:

11.4.8 按位非运算符(~)

产生式 UnaryExpression : ~ UnaryExpression 的求值过程如下:

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

ToInt32(Infinity) 的结果是 +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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接