2011-03-17 139 views
2

誰能向我解釋的改變結果,爲什麼下面的代碼:位運算符算術

var a = 0xFFFFFFFF; 
    a &= 0xFFFFFFFF; 
    a += 1; 
    alert("a = " + a); 

    var b = 0xFFFFFFFF; 
    b += 1; 
    alert("b = " + b); 

回報爲不同的a和b的值?

由於0xFFFFFFFF & 0xFFFFFFFF應該等於0xFFFFFFFF,這兩段代碼應該返回0x100000000。取而代之的是得到0的值,並且b得到0x100000000的值。

+0

關於你的最後一個問題 - 在'b + = 1'之前加上'b&= 0xFFFFFFFF'! – 2011-03-17 13:20:45

+0

順便說一句,你得到'a'和'b'的結果是什麼? – 2011-03-17 13:21:38

+0

我不應該因爲0xFFFFFFFF&0xFFFFFFFF = 0xFFFFFFFF。他們應該是兩次完全相同的價值。 – Sparafusile 2011-03-17 13:22:01

回答

2

由於JavaScript與簽署的整數,4294967295不能用32位表示,因此它被轉換爲更寬的類型。對位運算符

var a = 0xFFFFFFFF; 
alert("a = " + a); // gives 4294967295 (too large for a signed 32-bit integer) 

a &= 0xFFFFFFFF; // gives result as 32 bit signed integer 
alert("a = " + a); // gives -1 

詳細信息可以在這裏找到:Mozilla Developer Network: Bitwise Operators

如果初始化a0xFFFFFFF(那7 F)你得到預期的結果。

var a = 0xFFFFFFF; 
alert("a = " + a); // gives 268435455 
a &= 0xFFFFFFFF; 
alert("a = " + a); // gives 268435455 
+0

對於32位整數,0xFFFFFFFF不是太大。它是一個32位整數可以容納的最大值。 – Sparafusile 2011-03-17 13:30:44

+0

對。剛剛更新了我的答案。 – aioobe 2011-03-17 13:31:10

+0

它仍然沒有意義。 0xFFFFFFFF是一個32位整數,顯示爲4294967295.然後,我使用另一個32位整數作爲第二個操作數執行一個按位運算符。兩者都轉換爲一個位數組來執行和。結果顯示爲有符號整數(-1)。數字顯示的方式除外爲什麼在進行按位操作之前將一個位數組轉換爲有符號整數?你給我的問題的答案,但還有幾個問題要問。 – Sparafusile 2011-03-17 13:40:45

0

試試這個:

var a = 0xFFFFFFFF; 
alert("a = " + a); 
a &= 0xFFFFFFFF; 
alert("a = " + a); 
a += 1; 
alert("a = " + a); 

,它應該是一點更加明顯發生了什麼事。 &=導致類型轉換不會發生在b

2

JS按位運算符返回一個簽名的 32位整數。 0xFFFFFFFF被轉換爲-1,並且加1得到0.

+0

這是有道理的。我想我不應該假設所有的JavaScript變量都是64位的。 – Sparafusile 2011-03-17 13:32:47

+0

JavaScript實際上不具有*整數。它只有數字,它們被實現爲雙精度,因此限制在53位精度(其餘11位用於指數)。在查詢使用64位整數作爲唯一標識符的數據庫時,我已經被這個事實困擾了。 – dan04 2011-03-17 13:40:07