7

尝试了很多,只是失败了..

$x = 76561198005785475;

我要这个号码,变成这个:

$y = 45519747;

那是它的 32 位形式。


试图解释更多细节:

http://www.tonymarston.net/php-mysql/converter.php

1)将值 76561198005785475 放在“十进制(输入)”字段中。2) 在“Binary (Base 2)”字段中按“DEC to BIN”。3)从右开始数32并复制。4) 将 32 个字符的二进制数粘贴到“Binary (Base 2)”字段中。5) 在“Binary (Base 2)”字段中按“Bin to Dec”按钮。

好的,现在您可以看到“45519747”号码。

4

4 回答 4

17

尝试这个:

$y = $x & 0xffffffff;

这会将您的 64 位值截断为 32 位值,但请注意,绝对没有办法恢复 64 位值,这是一种破坏性方法。

于 2012-07-27T16:22:13.587 回答
5

我尝试了很多解决方案。但是没有人帮助我。最后,以下脚本挽救了我的生命。

function intval32bits($value)
{
    $value = ($value & 0xFFFFFFFF);

    if ($value & 0x80000000)
        $value = -((~$value & 0xFFFFFFFF) + 1);

    return $value;
}
于 2017-04-04T06:49:51.803 回答
2

写评论太长了,所以我会在这里发布。

@Kolink 有正确的答案;你想要的是那个操作。但是,请注意,由于您的格式$x太大而无法以某种int格式存储,因此它将被保存为float32 位计算机,并且float会遭受精度损失。关于为什么你得到 45519744 而不是正确答案,我最喜欢的理论是你的 32 位计算机失去了最后一位数字的精度。要查看此操作,请在此处尝试:

$x = 76561198005785475;
echo (int)$x;

该站点使用 32 位服务器,它返回 45519744。这说明了精度损失。

另一方面,如果你去这里运行:

$x = 76561198005785475;
$y = $x & 0xffffff;

您会得到正确答案,因为该站点是 64 位的。

如果您想在 32 位机器上进行操作(显然您是这样做的),我建议您使用PHP GMP 扩展中的gmp_and。不幸的是,我无法测试它是否有效 - 我将把它留给你。

于 2012-07-27T17:15:40.607 回答
0

I had something similar. I was want to consider Overflow when converting from Int64 to Int32. this code worked well for me:

function intval32bits($value)
{
    $value = ($value & 0xFFFFFFFF);

    if ($value & 0x80000000)
        $value = -((~$value & 0xFFFFFFFF) + 1);

    return $value;
}
于 2021-04-28T11:38:33.500 回答