PHP与JS位运算结果差异:1085 <<24为何输出不同?
为什么PHP与JavaScript对同一按位左移运算给出不同结果?
这个问题我之前在项目里踩过坑,本质是PHP和JavaScript对整数的处理机制,尤其是按位运算时的位数限制完全不同,咱们一步步拆解来看:
JavaScript的计算逻辑
- JavaScript里所有数字默认都是64位双精度浮点数,但执行按位运算(比如
<<左移)时,会先把操作数强制转换成32位有符号整数,再进行计算。 - 拿
1085 << 24来说:- 先把1085转成32位二进制:
00000000 00000000 00000100 00111101 - 左移24位后得到:
00000100 00111101 00000000 00000000 - 这个二进制对应的十进制就是
1023410176,刚好在32位有符号整数的范围内(-2147483648 到 2147483647),所以直接作为结果返回。
- 先把1085转成32位二进制:
PHP的计算逻辑
- 现在绝大多数PHP运行环境都是64位系统,默认使用64位有符号整数,按位运算时不会截断到32位,而是直接基于64位整数计算。
- 同样是
1085 << 24:- 1085的二进制左移24位后,得到的是一个64位的二进制数:
00000000 00000000 00000000 00000100 00111101 00000000 00000000 00000000 - 对应的十进制就是
18203279360,这个数值远小于64位有符号整数的最大值(9223372036854775807),所以不会发生溢出,直接返回正确结果。
- 1085的二进制左移24位后,得到的是一个64位的二进制数:
如何让两者结果一致?
- 如果想让PHP输出和JS相同的结果,可以手动把计算结果截断为32位有符号整数,用位与操作
& 0xFFFFFFFF即可:echo (1085 << 24) & 0xFFFFFFFF; // 输出 1023410176 - 如果想让JS输出和PHP相同的结果,可以使用
BigInt来支持64位整数运算:console.log(BigInt(1085) << 24n); // 输出 18203279360n
内容的提问来源于stack exchange,提问作者Anton Osipov
相关产品推荐
相关产品推荐

