【问题标题】:Can I define PHP_INT_SIZE to 4 bytes on 64-bit system running PHP?我可以在运行 PHP 的 64 位系统上将 PHP_INT_SIZE 定义为 4 个字节吗?
【发布时间】:2012-10-21 21:46:15
【问题描述】:

我使用的是 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";
  • PHP_INT_MAX:2147483647
  • PHP_INT_SIZE:4 字节(32 位)

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

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

例如,假设以下代码:

$test = 4170266799;
print $test;                     
print (int) $test;

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

4170266799
-124700497

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

4170266799
4170266799

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

【问题讨论】:

  • 我会修复编码算法...
  • 这是the XY Problem 的实例吗?您真正想解决什么问题?
  • 不,这不是 XY 问题的一个实例。我正在转换用本机编译代码编写的大型代码库的一部分。我正在迁移到 PHP 以从 Web 访问其中的一部分,但是它必须以我的 32 位应用程序所期望的相同方式生成信息。这就是我依赖 INT 大小的原因。我选择进行尽可能接近的转换,而不是重新设计逻辑以生成相同的结果。幸运的是,我现在可以使用它了。
  • @Mick,您始终可以使用预编译器为您进行修改。

标签: php int


【解决方案1】:

不,这在很大程度上取决于平台本身:

整数的大小取决于平台,尽管有最大值 大约 20 亿是通常的值(即 32 位有符号)。 64 位平台的最大值通常约为 9E18。 PHP 确实 不支持无符号整数。

并且因为暴露整数大小和整数最大值的值是常量,所以它们不能更改 - 在 PHP 的编译时根据当前系统确定。

没有太多的安慰,但这就是为什么依赖诸如常量之类的东西(这不是您可以更改的,并且每次构建都会更改)或任何类型的“sizeof”实现与魔法一样邪恶代码中的数字 - 不要这样做。我们可以确定的一件事(至少,我希望!)是 4 是并且永远是 4,但不是 x, yz 将代表 4,即使他们现在这样做。

【讨论】:

  • 感谢您的回复。你是对的,我无法在 PHP 中更改 INT 的大小。幸运的是,即使我的代码在 64 位系统上运行,我也找到了一种在 32 位系统上将 INT “转换”为我期望的大小的方法。
  • 请告诉我们怎么做,米克。
【解决方案2】:

在 Stack Overflow 上引用 this question,我发现了一个似乎在我的早期测试中有效的解决方案:

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);

而在32位系统上的输出是:

4170266799  # $test = 4170266799
-124700497  # (int) $test
-124700497  # thirtyTwoBitIntval($test);

而在64位系统上的输出是:

4170266799  # $test = 4170266799
4170266799  # (int) $test
-124700497  # thirtyTwoBitIntval($test);

【讨论】:

猜你喜欢
  • 2015-03-08
  • 2011-04-23
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多