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

PHP与JS位运算结果差异:1085 <<24为何输出不同?

为什么PHP与JavaScript对同一按位左移运算给出不同结果?

这个问题我之前在项目里踩过坑,本质是PHP和JavaScript对整数的处理机制,尤其是按位运算时的位数限制完全不同,咱们一步步拆解来看:

JavaScript的计算逻辑

  • JavaScript里所有数字默认都是64位双精度浮点数,但执行按位运算(比如<<左移)时,会先把操作数强制转换成32位有符号整数,再进行计算。
  • 拿1085 << 24来说:
    1. 先把1085转成32位二进制:00000000 00000000 00000100 00111101
    2. 左移24位后得到:00000100 00111101 00000000 00000000
    3. 这个二进制对应的十进制就是1023410176,刚好在32位有符号整数的范围内(-2147483648 到 2147483647),所以直接作为结果返回。

PHP的计算逻辑

  • 现在绝大多数PHP运行环境都是64位系统,默认使用64位有符号整数,按位运算时不会截断到32位,而是直接基于64位整数计算。
  • 同样是1085 << 24:
    1. 1085的二进制左移24位后,得到的是一个64位的二进制数:00000000 00000000 00000000 00000100 00111101 00000000 00000000 00000000
    2. 对应的十进制就是18203279360,这个数值远小于64位有符号整数的最大值(9223372036854775807),所以不会发生溢出,直接返回正确结果。

如何让两者结果一致?

  • 如果想让PHP输出和JS相同的结果,可以手动把计算结果截断为32位有符号整数,用位与操作& 0xFFFFFFFF即可:
    echo (1085 << 24) & 0xFFFFFFFF; // 输出 1023410176
    
  • 如果想让JS输出和PHP相同的结果,可以使用BigInt来支持64位整数运算:
    console.log(BigInt(1085) << 24n); // 输出 18203279360n
    

内容的提问来源于stack exchange,提问作者Anton Osipov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:14:08