Проблема с gmp_xor на 32 бит - PullRequest
0 голосов
/ 25 июля 2011

На 64-битной машине

(1 ^ 2489596804)

дает -1805370491 в ответ.Однако, когда я делаю это на 32-битной машине PHP, я получаю 2489596805 в ответ.

Итак, я попытался заставить его работать на 32-битной машине, используя gmp_strval(gmp_xor(1,2489596804)), но это такжедает 2489596805.Так что случилось, и как я могу получить правильный ответ?

Обновление: я только что заметил, что 64-битный результат - это то, что вы получаете, вычитая из него 32-битный максимум (4294967295).

1 Ответ

1 голос
/ 25 июля 2011

Это один и тот же результат, просто интерпретируется по-разному:

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;
}
...