按位右移PHP x32和x64

时间:2014-02-02 14:56:02

标签: php

我正在尝试在本地计算机和服务器上使用按位右移。结果不同。我在PHP上使用这个测试:

$sourceInt = 1391343920825;
$resultInt = $sourceInt >> 3;
$resultInt32 = $resultInt & 0xffffffff; // Here I'm trying to cut all bits older than 32

echo "TEST:<br>";
echo "x64: " . $resultInt;
echo "<br>x32: " . $resultInt32;

$binSource = unpack ( "C*", pack ( "L", $sourceInt ) );
$binInt = unpack ( "C*", pack ( "L", $resultInt ) );
$binInt32 = unpack ( "C*", pack ( "L", $resultInt32 ) );

echo "<br>Binaries:<br>Source bin: ";
var_dump ( $binSource );
echo "<br>x64 bin: ";
var_dump ( $binInt );
echo "<br>x32 bin: ";
var_dump ( $binInt32 );

我在本地计算机上拥有的内容(PHP 5.3 x32):

TEST:
x64: -28185385
x32: -28185385
Binaries:
Source bin: array(4) { [1]=> int(185) [2]=> int(102) [3]=> int(143) [4]=> int(242) } 
x64 bin: array(4) { [1]=> int(215) [2]=> int(236) [3]=> int(81) [4]=> int(254) } 
x32 bin: array(4) { [1]=> int(215) [2]=> int(236) [3]=> int(81) [4]=> int(254) }

在服务器上(PHP 5.3 x64):

TEST:
x64: 173917990103
x32: 2119298263
Binaries:
Source bin: array(4) { [1]=> int(185) [2]=> int(102) [3]=> int(143) [4]=> int(242) } 
x64 bin: array(4) { [1]=> int(215) [2]=> int(236) [3]=> int(81) [4]=> int(126) } 
x32 bin: array(4) { [1]=> int(215) [2]=> int(236) [3]=> int(81) [4]=> int(126) }

什么是错的家伙?我什么都不知道。

P.S。看起来服务器也是x32,因为Integer只存储在4个字节而不是8个字节中。

1 个答案:

答案 0 :(得分:0)

32位整数只能存储最大值2,147,483,647(2 31 -1)。

根据PHP manual's "Integers"

  

整数的大小取决于平台,尽管最大值约为20亿是通常的值(32位有符号)。 64位平台的最大值通常约为9E18。

要在PHP中执行超出本机功能的数学运算,请尝试使用GMP扩展名。