我注意到在JS中使用按位AND运算符的奇怪行为:
console.log((0xd41ddb80 & 0xd41ddb80).toString(16))
结果是-2be22480,但我期待0xd41ddb80
这种行为的原因是什么?
答案 0 :(得分:5)
来自MDN
所有位运算符的操作数都以2的补码格式转换为带符号的32位整数。
当解释为带符号的32位整数时,值0xd41ddb80
表示数字-736240768
。在此数字上使用任何按位运算符会将其强制转换为带符号的32位整数:
console.log(~~0xd41ddb80)
console.log(0xd41ddb80 & 0xffffffff)
console.log(0xd41ddb80 | 0)
-736240768
的16等效基数为-2be22480
,这就是您所看到的。
您可以观察到大于或等于0x80000000
的任何数字的类似行为。