Пытается много и просто терпит неудачу ..
$x = 76561198005785475;
Я хочу это число, превратись в это:
$y = 45519747;
Это 32-битная форма.
Попытка объяснить более подробно:
http://www.tonymarston.net/php-mysql/converter.php
1) Поместите значение 76561198005785475 в поле «Десятичный (ввод)». 2) Нажмите «DEC to BIN» в поле «Binary (Base 2)». 3) Счет 32, начиная с ПРАВО и скопируйте его. 4) Вставьте двоичное число 32 символов в поле «Binary (Base 2)». 5) Нажмите кнопку «Bin to Dec» в поле «Binary (Base 2)».
Итак, теперь вы можете увидеть номер «45519747».
Попробуй это:
$y = $x & 0xffffffff;
Это приведет к усечению вашего 64-битного значения в 32-битное значение, но обратите внимание, что нет абсолютно никакого способа вернуть 64-битное значение, это деструктивный метод.
Это слишком долго, чтобы писать комментарий, поэтому я отправлю его здесь.
@Kolink имеет правильный ответ; то, что вы хотите, это операция. Однако обратите внимание, что, поскольку ваш $x
слишком велик, чтобы быть сохраненным в формате int
любом случае, он будет удерживаться как float
в 32-разрядных компьютерах, а float
s будет страдать от потери точности. Моя теория о том, почему вы получаете 45519744 вместо правильного ответа, заключается в том, что ваш 32-разрядный компьютер потерял точность на последних цифрах. Чтобы увидеть это в действии, попробуйте здесь :
$x = 76561198005785475; echo (int)$x;
Этот сайт использует 32-битный сервер, и он возвращает 45519744. Это демонстрирует потерю точности.
С другой стороны, если вы пойдете сюда и запустите:
$x = 76561198005785475; $y = $x & 0xffffff;
Вы получаете правильный ответ, потому что этот сайт 64-битный.
Если вы хотите выполнить операцию на 32-битной машине (как вы, очевидно, делаете), я предлагаю вам использовать gmp_and из расширения PHP GMP. К сожалению, я не мог проверить, работает ли это – я оставлю это вам.
Я попробовал много решений. Но никто мне не помогает. Наконец, следующий сценарий спасет мою жизнь.
function intval32bits($value) { $value = ($value & 0xFFFFFFFF); if ($value & 0x80000000) $value = -((~$value & 0xFFFFFFFF) + 1); return $value; }