Php 从64位数字转换为32位数字

Php 从64位数字转换为32位数字,php,32bit-64bit,Php,32bit 64bit,尝试了很多,但都失败了 $x = 76561198005785475; 我想把这个号码变成这个: $y = 45519747; 这就是它的32位形式 试图用更多细节解释: 1) 将值76561198005785475放入“十进制(输入)”字段。 2) 在“二进制(基数2)”字段中按“从DEC到BIN”。 3) 从右边开始数到32,然后复制它。 4) 将32个字符的二进制数粘贴到“二进制(基数2)”字段上。 5) 按“二进制(基数2)”字段上的“从二进制到十进制”按钮 好的,现在您可以看到

尝试了很多,但都失败了

$x = 76561198005785475;
我想把这个号码变成这个:

$y = 45519747;
这就是它的32位形式


试图用更多细节解释:

1) 将值76561198005785475放入“十进制(输入)”字段。 2) 在“二进制(基数2)”字段中按“从DEC到BIN”。 3) 从右边开始数到32,然后复制它。 4) 将32个字符的二进制数粘贴到“二进制(基数2)”字段上。 5) 按“二进制(基数2)”字段上的“从二进制到十进制”按钮

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

试试这个:

$y = $x & 0xffffffff;

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

这太长,无法写入注释,因此我将在此处发布

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

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

另一方面,如果你去跑步:

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


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

我尝试了许多解决方案。但是没有人帮我。最后,下面的脚本救了我的命

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

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

    return $value;
}

我也有类似的经历。我想考虑当从It64转换为It32时溢出。这段代码对我很有效:

函数Intval32位($value)
{
$value=($value&0xFFFFFFFF);
如果($value&0x8000000)
$value=-(~$value&0xFFFFFFFF)+1);
返回$value;
}

你想要什么毫无意义。放入32位整数中的64位数字可能是负数,也可能是溢出数(取决于我们谈论的是无符号整数还是有符号整数)。解释一下你是如何从
76561198005785475
中获得
45519747
@Ramhound:也许他是指45519744,这就是Kolink和我的答案所给出的?@MatteoTassinari-评论的要点是指出64位整数只能被截断为32位数字。即使他在寻找
45519744
他想要的也毫无意义。@Ramhound:我知道这毫无意义,但如果他想要,我们为什么不给他“解决方案”?@MatteoTassinari-我们需要继续讨论这个话题。我们应该弄清楚他想做什么,而不是试图满足他的要求,因为他所要求的毫无意义;这似乎确实是OP想要的。得到45519744,而不是45519747哈哈。也许OP的意思是45519744?奇怪的是,当我尝试这段代码时,它就像一个符咒。是的,我得到的值是45519747。好的,我补充了一些信息。很抱歉最初的解释不好。谢谢,我不知道为什么我会得到这样的结果:(多亏了这些帮助。我现在使用的是64位windows,结果是45519744。在你告诉我的这个网站上,答案是45519747。这个网站使用的是32位操作系统。@Hor-Huh。这…更奇怪。也许你的PHP是32位的?…但是
gmp\u和
?它能工作吗?还有,(确保我们谈论的是同一个)不能是32位-它存储
$x
,它作为一个整数大于32位的最高整数。这是一个方便的复制/粘贴,谢谢。我不确定和是~$value所必需的,但是,考虑到你已经在开始时屏蔽了它。实际上第二个和是必需的,不是最左边的32位,对不起。这正是我需要的d、 谢谢你的发帖。
$x = 76561198005785475;
$y = $x & 0xffffff;
function intval32bits($value)
{
    $value = ($value & 0xFFFFFFFF);

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

    return $value;
}