4
任何人都可以解释:在JavaScript中,为什么~~ Infinity评估为0?
为什么双位NOT为无限
returns 0
?~~Infinity //return 0
发生了什么?
无穷大在JavaScript中的二进制表示是什么?
任何人都可以解释:在JavaScript中,为什么~~ Infinity评估为0?
为什么双位NOT为无限returns 0
?
~~Infinity //return 0
发生了什么?
无穷大在JavaScript中的二进制表示是什么?
因为您没有在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
。- 让
oldValue
为ToInt32(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
不知道为什么双是相关的。 '〜Infinity'是'-1'。 –
“JavaScript中无穷大的二进制表示是什么?” JS使用IEEE 754标准的浮点数,所以它将是(对于pos inifinity)0符号,指数的所有1和尾数将是0(js数字是64b,但是32b ieee754 inf将看起来像0 1111 1111 0000 0000 0000 0000 0000 000) –
你会在这里找到一些信息 - > [双位NOT(~~)](https://j11y.io/cool-stuff/double-bitwise-not) –