JavaScript中位运算符为何以整数模式运行?技术问询
JavaScript位运算的整数逻辑实现原理
JavaScript里的Number类型确实是用64位双精度浮点数存储所有数字,但位运算符执行时会经过以下几个步骤,模拟出整数运算的效果:
先看你给出的例子:
1 | 2 // -> 3 2 << 4 // -> 32
背后的实现步骤是:
第一步:将操作数转为32位有符号整数
位运算的每个操作数都会先执行ToInt32转换:- 如果是
NaN、正负无穷、正负0,直接转成0; - 其他数字会先取绝对值,对
2^32取模,再根据原数的正负调整结果:正数直接用模后的值,负数则用2^32减去模后的值(得到32位补码形式的整数)。
你例子里的1和2都是正整数,转成32位整数后就是本身,没有变化。
- 如果是
第二步:执行32位整数位运算
转换完成后,位运算符会基于32位二进制补码对这两个整数执行对应的位操作:- 按位或
1 | 2:二进制里000...0001和000...0010按位或得到000...0011,对应十进制的3; - 左移
2 << 4:把2的二进制左移4位,等价于乘以2^4,得到32。
- 按位或
第三步:转回64位浮点数
位运算得到的32位整数会再转回64位双精度浮点数返回。因为32位有符号整数的范围(-2^31到2^31-1)完全在浮点数的精确表示范围内,所以这个转换不会有精度损失。
这种设计是因为早期JavaScript需要和其他静态类型语言(比如C)交互,同时要兼顾自身单数字类型的特性,所以通过临时转换的方式让位运算支持整数逻辑。
内容的提问来源于stack exchange,提问作者csh
相关产品推荐
相关产品推荐

