有人可以向我解释为什么以下代码:
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 :(得分:3)
JS按位运算符返回签名的 32位整数。 0xFFFFFFFF转换为-1,加1表示0。
答案 1 :(得分: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
如果您将a
初始化为0xFFFFFFF
(即7 F
s),您将获得预期的结果。
var a = 0xFFFFFFF;
alert("a = " + a); // gives 268435455
a &= 0xFFFFFFFF;
alert("a = " + a); // gives 268435455
答案 2 :(得分:0)
试试这个:
var a = 0xFFFFFFFF;
alert( "a = " + a );
a &= 0xFFFFFFFF;
alert( "a = " + a );
a += 1;
alert( "a = " + a );
并且应该更明显地发生了什么。 &=
导致b
不会发生类型转换。
答案 3 :(得分:0)
在JavaScript中,以下表达式为true
:
(0xFFFFFFFF & 0xFFFFFFFF) == -1
如dan04所述,布尔运算的结果是一个有符号的32位整数值,与参数的类型无关。 当您查看0xFFFFFFFF和-1的位模式时,使用32位值时它们是相同的。
要始终获得积极的结果,可以在结果为负时将2 ^ 32加到结果中。
function and(a, b) { let y = a & b; return (y < 0) ? (y + 0x100000000) : y;}
那么下面的表达式是true
:
and(0xffffffff, 0xffffffff) == 0xffffffff