[英]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 >> y
, x
會轉換為帶符號的32位整數。 然后將其右移y
位置。
您的值0xfffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000因為這是最低的32位 右移將得到零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.