2017-06-29 97 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 
相關問題