【问题标题】:Bitwise right shift PHP x32 and x64按位右移 PHP x32 和 x64
【发布时间】:2014-02-02 14:56:02
【问题描述】:

我正在尝试在本地机器和服务器上使用按位右移。结果是不同的。我在两个 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) }

你们怎么了?我不知道。

附:看来服务器也是 x32 的,因为 Integer 只存储在 4 个字节而不是 8 个字节中。

【问题讨论】:

    标签: php


    【解决方案1】:

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

    根据PHP manual's "Integers"

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

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

    【讨论】:

    • 我看到了 GMP 扩展,但没有找到任何按位右移/左移操作。那么我该如何在我的情况下使用它呢?请给我举个例子好吗?
    • 哦,我找到了答案:左移,只需将数字乘以 pow(2,x),右移,除以 pow(2,x)。谢谢你的解决方案,我马上试试=)
    • 当我使用 GMP 分机时,它也会返回错误的结果:173917990103。
    猜你喜欢
    • 2019-10-25
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多