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) –