PHP按位左移32位问题以及大数算术运算的不良结果

Vic*_*ciu 3 php precision bit-manipulation

我有以下问题:

第一:我试图对一个大数进行 32 位按位左移,并且由于某种原因该数字总是按原样返回。例如:

echo(516103988<<32); // echoes 516103988
Run Code Online (Sandbox Code Playgroud)

因为将位向左移动一位相当于乘以 2,所以我尝试将数字乘以 2^32,并且它有效,它返回 2216649749795176448。

第二:我必须将 9379 添加到上面的数字中:

printf('%0.0f', 2216649749795176448 + 9379); // prints 2216649749795185920 
Run Code Online (Sandbox Code Playgroud)

应打印:2216649749795185827

Pas*_*TIN 5

执行 32 位移位操作可能不会像您期望的那样工作,因为整数往往存储在 32 位上。

引用此页:按位运算符

在 32 位系统上右移不要超过 32 位。
不要左移,以免导致数字长度超过 32 位。
使用 gmp 扩展中的函数对超出 的数字进行按位操作 PHP_INT_MAX