迁移到生产环境时,我的代码遇到了一个问题,因为生产服务器是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位的正变量