为什么Javascript和PHP中的LShift(<;<;)不一样?

为什么Javascript和PHP中的LShift(<;<;)不一样?,javascript,php,Javascript,Php,这一次是关于升档的 在Javascript中: document.write((1732584193 << 5)+"<br />"); document.write((125 << 5)+"<br />"); echo (1732584193 << 5)."<br />"; echo (125 << 5)."<br />"; 在PHP中: document.write((1732584193 &l

这一次是关于升档的

在Javascript中:

document.write((1732584193 << 5)+"<br />");
document.write((125 << 5)+"<br />");
echo (1732584193 << 5)."<br />";
echo (125 << 5)."<br />";
在PHP中:

document.write((1732584193 << 5)+"<br />");
document.write((125 << 5)+"<br />");
echo (1732584193 << 5)."<br />";
echo (125 << 5)."<br />";

对于小数字来说一切正常,但是大整数不起作用,为什么?

这是因为您使用的是64位版本的php。在32位系统上,结果是相同的

这就是32位系统上的位发生的情况:

source number: 01100111010001010010001100000001
first shift:   11001110100010100100011000000010
2nd:           10011101000101001000110000000100
3rd:           00111010001010010001100000001000
4th:           01110100010100100011000000010000
5th:           11101000101001000110000000100000
前5位丢失,最后一个数字设置了最左边的位,因此它被视为负数。在64位上,图片不同:

source:  0000000000000000000000000000000001100111010001010010001100000001
shifted: 0000000000000000000000000000110011101000101001000110000000100000
在PHP中,整数依赖于平台(32/64位),Javascript总是使用32位整数进行逐位操作

要在64位系统上模拟32位移位,请将结果向左移位32位,然后再向右移位。这将剥离额外的位并导致符号位传播:

$a = 1732584193;

$b = $a << 5;
$c = (($a << 5) << 32) >> 32;

echo $a, "\n"; # 1732584193
echo $b, "\n"; # 55442694176
echo $c, "\n"; # -391880672
$a=1732584193;

$b=$a我想使用64位PHP有可能吗?