如何在64位PHP安装上使用32位整数


How to use a 32bit integer on a 64bit installation of PHP?

迁移到生产环境时,我的代码遇到了一个问题,因为生产服务器是32位的,而我的开发机器是64位的(我运行的是Kubuntu 12.04 64位)。我的问题是。是否有可能在不安装23位PHP版本的情况下强制int为32位?或者是一个允许我选择max int value

的库

整数是该平台上指针的大小。(32位PHP -> 32位整数。64位PHP -> 64位整数)。

注意,当整数运算溢出时,变量变成浮点数。PHP文档很好地解释了这一切。

我不确定你在代码中做了什么,会导致你关心整数的大小。但是,如果您只关心值的32位,则始终可以屏蔽低32位:

$val = $something & 0xFFFFFFFF;
$r = $r & 0xFFFFFFFF;
if ($r & 0x80000000)
{
    $r = $r & ~0x80000000;
    $r = -2147483648 + $r;
}
$r = $r & 0xFFFFFFFF;
if ($r & 0x80000000)
{
    $r = $r & ~0x80000000;
    $r = -2147483648 + $r;
}

试图解释是谁请求的

取$r大数变量(假设分布在64位上),只允许最右边的32位传递。

$r = $r & 0xFFFFFFFF; //aka 0x00000000FFFFFFFF

现在64位$r变量有32个零和你的32位。请注意,在64位和32位表示中,通常最左边的位是符号:加(0)或减(1),因此64位的$r现在被PHP认为是正数。

if ($r & 0x80000000) {

"32个零,你的32位"与"32个零,1和31个零&;如果这为真,意味着至少(最多)有一个1,这再次意味着:"在32位世界中,这是一个负数",在这种情况下,我们还需要告诉PHP这是一个负数,因为64位变量$r的最左位仍然是0,PHP仍然认为这是一个正数。

告诉PHP这是一个负数,然后改基数。第一步,将32位的最左边设置为零,以强制32位的正数。

$r = $r & ~0x80000000;

~0x80000000确实可以重写为0xFFFFFFFF7FFFFFFF: 32个位,1个位,31个位。

现在你在一个64位变量中有一个32位正的数字表示,它是与它相关的32位负表示的互补:例如,如果你在开始有64个1(十进制的-1),此时$r是32个零,1个零你刚刚设置,31个1(十进制的2147483647)。

你现在应该看到点了:

$r = -2147483648 + $r;

最小可表示的32位数+我们的互补正数。

此时,$r变量仍然是一个64位变量,但它现在正确地表示您在开始时选择的最右32位的负数。

整个问题是,在64位PHP中,如果您提取最右边的32位并填充另一个64位变量,则值仍然是正的,因为64位的最左边是0。我们想要实现的是:让64位变量为负,如果提取的32位代表一个负数;如果提取的32位表示正数,则为64位的正变量