为什么两个相同值的按位与产生不同的值?

Why is the bitwise AND of two of the same value producing a different value?

我注意到在 JS 中使用按位 AND 运算符有一个奇怪的行为:

console.log((0xd41ddb80 & 0xd41ddb80).toString(16))

结果是-2be22480,但我期待的是0xd41ddb80

造成这种行为的原因是什么?

来自MDN

The operands of all bitwise operators are converted to signed 32-bit integers in two's complement format.

当解释为带符号的 32 位整数时,值 0xd41ddb80 表示数字 -736240768。对该数字使用任何按位运算符会将其强制转换为带符号的 32 位整数:

console.log(0xd41ddb80)


console.log(~~0xd41ddb80)
console.log(0xd41ddb80 & 0xffffffff)
console.log(0xd41ddb80 | 0)

-736240768 的 base-16 等效项是 -2be22480,这就是您所看到的。

对于任何大于或等于 0x80000000 的数字,您都可以观察到类似的行为。