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

ass*_*saf 2 javascript bitwise-operators bitwise-and

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

console.log((0xd41ddb80 & 0xd41ddb80).toString(16))
Run Code Online (Sandbox Code Playgroud)

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

这种行为的原因是什么?

JLR*_*she 5

来自MDN

所有位运算符的操作数都以二进制补码格式转换为带符号的32位整数.

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

console.log(~~0xd41ddb80)
console.log(0xd41ddb80 & 0xffffffff)
console.log(0xd41ddb80 | 0)
Run Code Online (Sandbox Code Playgroud)

基16当量的-736240768-2be22480,这是你所看到的.

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