JavaScript中右移运算符处理负数为何出现预期外结果?
JavaScript 右移(>>)运算符处理负数的机制解析
你遇到的问题核心是有符号右移(>>)运算符对负数的处理逻辑和正数不同,本质是它会保留符号位,且最终效果等价于对除法结果做向下取整,而非简单截断小数部分。
有符号右移的核心规则
- 正数右移:左侧填充
0,结果等价于整除(比如12 >> 1 = 6,和12/2结果一致); - 负数右移:左侧填充符号位(1)——因为负数在二进制中以补码形式存储,最高位是代表负号的1,右移时会保持符号不变,这就导致最终结果是对除法结果向下取整,而非截断小数。
拆解-27 >> 1的计算过程
-27的32位有符号补码为:11111111 11111111 11111111 11100101- 右移1位后,左侧补符号位1,得到新补码:
11111111 11111111 11111111 11110010 - 该补码转换为十进制就是
-14
为什么不是预期的-13?
-27 / 2 = -13.5,如果只是截断小数会得到-13,但有符号右移遵循向下取整逻辑(往更小的整数方向取值),-13.5向下取整的结果就是-14,这和运算符的符号位填充逻辑完全对应。
简单总结:
- 正数右移:等价于
Math.floor(数字 / 2^n)(和整除结果一致) - 负数右移:同样等价于
Math.floor(数字 / 2^n),此时和截断小数的结果会产生差异
内容的提问来源于stack exchange,提问作者Aditya Basak
相关产品推荐
相关产品推荐

