You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中右移运算符处理负数为何出现预期外结果?

JavaScript 右移(>>)运算符处理负数的机制解析

你遇到的问题核心是有符号右移(>>)运算符对负数的处理逻辑和正数不同,本质是它会保留符号位,且最终效果等价于对除法结果做向下取整,而非简单截断小数部分。

有符号右移的核心规则

  • 正数右移:左侧填充0,结果等价于整除(比如12 >> 1 = 6,和12/2结果一致);
  • 负数右移:左侧填充符号位(1)——因为负数在二进制中以补码形式存储,最高位是代表负号的1,右移时会保持符号不变,这就导致最终结果是对除法结果向下取整,而非截断小数。

拆解-27 >> 1的计算过程

  1. -27的32位有符号补码为:11111111 11111111 11111111 11100101
  2. 右移1位后,左侧补符号位1,得到新补码:11111111 11111111 11111111 11110010
  3. 该补码转换为十进制就是-14

为什么不是预期的-13?

-27 / 2 = -13.5,如果只是截断小数会得到-13,但有符号右移遵循向下取整逻辑(往更小的整数方向取值),-13.5向下取整的结果就是-14,这和运算符的符号位填充逻辑完全对应。

简单总结:

  • 正数右移:等价于Math.floor(数字 / 2^n)(和整除结果一致)
  • 负数右移:同样等价于Math.floor(数字 / 2^n),此时和截断小数的结果会产生差异

内容的提问来源于stack exchange,提问作者Aditya Basak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 09:20:53