我可以在运行PHP的64位系统上将PHP_INT_SIZE定义为4个字节吗?

Mic*_*ick 15 php int

我使用的是PHP 5.3.

在我的32位系统上INT的大小:

print "PHP_INT_MAX: " . PHP_INT_MAX . "\n";
print "PHP_INT_SIZE: " . PHP_INT_SIZE . " bytes (" . (PHP_INT_SIZE * 8) . " bits)\n";
Run Code Online (Sandbox Code Playgroud)
  • PHP_INT_MAX:2147483647
  • PHP_INT_SIZE:4个字节(32位)

但是,我使用的编码算法的一部分依赖于int是上述大小(4个字节)的事实.当我在我的Web主机服务器上运行代码时,它是一个64位系统,int大小是两倍大.

有没有办法强制"(int)"强制转换使用32位大小?

例如,假设以下代码:

$test = 4170266799;
print $test;                     
print (int) $test;
Run Code Online (Sandbox Code Playgroud)

在我的32位系统上,输出是:

4170266799
-124700497
Run Code Online (Sandbox Code Playgroud)

在我的64位系统上,输出是:

4170266799
4170266799
Run Code Online (Sandbox Code Playgroud)

即使架构从32位更改为64位,是否可以强制INT的值为4个字节?

Mic*_*ick 4

参考Stack Overflow 上的这个问题,我找到了一个在我的早期测试中似乎有效的解决方案:

function thirtyTwoBitIntval($value)
{                  
    if ($value < -2147483648)
    {
    return -(-($value) & 0xFFFFFFFF);
    }
    elseif ($value > 2147483647)
    {
        return ($value & 0xFFFFFFFF);
    }
    return $value;
}


$test = 4170266799;
print $test;                     
print (int) $test;
print thirtyTwoBitIntval($test);
Run Code Online (Sandbox Code Playgroud)

32位系统上的输出是:

4170266799  # $test = 4170266799
-124700497  # (int) $test
-124700497  # thirtyTwoBitIntval($test);
Run Code Online (Sandbox Code Playgroud)

64位系统上的输出是:

4170266799  # $test = 4170266799
4170266799  # (int) $test
-124700497  # thirtyTwoBitIntval($test);
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,你的解决方案不起作用,测试确实失败了。该解决方案确实有效:http://stackoverflow.com/a/2123458/1140922 (3认同)