2011-03-17 137 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