麻烦gmp_xor在32位

时间:2011-07-25 00:44:55

标签: php bitwise-operators gmp

在64位计算机上

(1 ^ 2489596804)

给出-1805370491作为回应。但是,当我在32位PHP机器上执行此操作时,我得到2489596805作为响应。

因此,我尝试使用gmp_strval(gmp_xor(1,2489596804))在32位计算机上运行它,但它也会产生2489596805。那么什么事,我怎样才能得到正确的答案?

更新:我刚刚注意到64位结果是从中减去32位最大值得到的结果(4294967295)。

1 个答案:

答案 0 :(得分:1)

这是相同的结果,只是解释不同:

0x94643B85 =  2489596805 (unsigned 32-bit integer)
0x94643B85 = -1805370491 (signed 32-bit integer)

您在64位计算机上看到负值的原因是您将该结果解释为带符号的32位整数。

如果你真的想在两种解释之间进行转换,我认为你必须自己做。一个简单的方法就是这样:

<?php
function toSigned($value) {
  if ($value <= 2147483647)
    return $value;
  return $value - 4294967295 + 1;
}

function toUnsigned($value) {
  if ($value >= 0)
    return $value;
  return $value + 4294967295 - 1;
}