当我把代码移植到生产环境时,遇到了一个问题,因为生产服务器是32位的,而我的开发机是64位的(我运行的是Kubuntu 12.04 64位)。我的问题是:是否可以强制将int转换为32位,而不必安装PHP 32位版本?如果可以,那么是否有一个库可以让我选择最大的int值?
$val = $something & 0xFFFFFFFF;
$r = $r & 0xFFFFFFFF;
if ($r & 0x80000000)
{
$r = $r & ~0x80000000;
$r = -2147483648 + $r;
}
$r = $r & ~0x80000000;
这部分是如何工作的?使用 ~
对位进行取反有什么意义,然后再执行 $r = -2147483648 + $r;
? - tonix
$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),因此PHP现在认为64位的$r是正数。
if ($r & 0x80000000) {
因此,让我们告诉PHP这实际上是一个负数并重新调整数字。第一步,将你的32位中最左边的位置设置为零,以强制其为正数。
$r = $r & ~0x80000000;
~0x80000000 实际上可以被重写为 0xFFFFFFFF7FFFFFFF:32个1,1个0,31个1。
现在你有一个正的32位数字表示在一个64位变量内,并且它是与其相关的32位负表示的补码:例如,如果一开始有64个1(十进制中的-1),此时 $r 是32个0,1个刚设置的0,31个1(十进制中的2147483647)。
现在你应该明白了:
$r = -2147483648 + $r;
最小可表示的32位数字+我们的补码正数。
此时,$r变量仍然是一个64位变量,但现在它正确地表示了您在开始时选择的32个最右位的负面性。
整个问题在于,在64位的PHP中,如果您提取最右边的32位,并用另一个64位变量填充,那么该值仍然是正数,因为64位最左边是0。相反,我们想实现的是:如果提取的32位表示负数,则使64位变量为负;如果提取的32位表示正数,则使64位变量为正。
(int)
转换。我修复了错误,但强制使用32位可以帮助进行单元测试。是的,我希望有一种不需要单独安装的方法。太遗憾了 =/ - Yohan Leafheart