簡體   English   中英

意外的右移操作員行為

[英]Unexpected Right Shift Operator behavior

請查看以下Node.js REPL輸出:

> n=10
10
> console.log(n.toString(2)); //ok ?
1010
undefined
> m=n>>1 
5
> console.log(m.toString(2)); //cool :)
101

這正在按預期方式工作。 現在來看這個:

> n=Number.MAX_VALUE
1.7976931348623157e+308
> m=n>>1
0
> n.toString(16) // to read easier
'fffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
> m.toString(16) // to read easier
'0'

剛剛發生什么事了? 我不應該右移

fffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

1位數給我

7ffffffffffffc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我怎么變成零呢?

另外,我注意到這不僅僅是V8 / Node問題。 我在Firebug中得到了相同的結果。

Javascript的位級操作僅適用於32位帶符號的值(對於零擴展>>>運算符,則為無符號)。 在進行位操作之前,高於這32位的任何內容都將設置為零。

在JavaScript中,當您計算x >> yx會轉換為帶符號的32位整數。 然后將其右移y位置。

您的值0xfffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000因為這是最低的32位 右移將得到零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM