如何使用32位计算机在PHP中打印40位数字

阿克塞尔·亨特

我正在尝试在php中打印40位数字。但是,当使用Windows计算机时,它仅允许使用32位整数,这导致我的代码回显了错误的结果。以下代码示例:

function decoded_microchip_id($coded_string) {
     $manufacturer = substr($coded_string, 0, 3);
     $manufacturer = hexdec($manufacturer);
     $manufacturer = $manufacturer / 4;
     $device_id = substr($coded_string, 2, 11);
     $device_id = hexdec($device_id);
     $device_id = $device_id & 0x3fffffffff;
     echo $manufacturer.'.'.$device_id;
};

decoded_microchip_id('f58e29a43c67');

上面的代码的正确输出是:982.60828171367

但是在我的32位Windows环境中,我得到了:982.698629223

在各种PHP沙箱中测试代码时,输​​出也会有所不同。

这是一个沙盒环境示例,为我提供了正确的输出:http : //sandbox.onlinephpfunctions.com/code/83cc28fd5314557e7a9d86d8061e1c8dfae4d1b7

以下是产生错误输出的环境的示例:http : //codepad.org/m2ygOgC6

有谁知道解决这个问题的方法或解决方案。

谢谢。

缺氧

PHP函数也hexdec()可以在32位上正常工作。文档说,float当结果不适合32位时,它将产生数字。

有趣的是,0x3fffffffff它也存储为float数字。

罪魁祸首是&似乎产生整数的按位运算符()。将其结果转换为float并没有帮助,损坏已经完成。

该行为记录在案

两个操作数都将转换为整数,结果将为整数。

潜在的解决方案

您可以尝试将输入字符串拆分成适合32位的部分,并在它们上使用按位运算符,然后使用加法和乘法来生成最终值(如果不能容纳32位,则加法和乘法会将结果转换为浮点型)。

具体解决方案

对于这种情况,一种更简单的解决方案是将十六进制字符串转换为其编码数字的二进制表示形式,提取每个组件所需的位,然后将值转换为十进制。在这种情况下,不涉及位操作(除了转换,但这些转换似乎正常工作)。

function decoded_microchip_id($coded_string)
{
    // Convert to binary
    $bin = base_convert($coded_string, 16, 2);
    // Split to 10/38 bits
    $manufacturer = substr($bin, 0, 10);
    $device_id    = substr($bin, 10, 38);
    // Convert to decimal
    $manufacturer = bindec($manufacturer);
    $device_id    = bindec($device_id);
    // Put pieces back
    return $manufacturer.'.'.$device_id;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在64位计算机上,Java中的int大小是32位还是64位?

在Java中的64位计算机上运行32位dll

在32位和64位计算机上总是64位

如何在64位计算机上运行针对32位的API?

如何计算32位整数中的设置位数?

32位计算机如何计算双精度数

使用Lua中的32位按位运算比较带符号的64位数字

指向64位数字中的32位是否安全?

如何在我的64位计算机上使用gcc编译32位.o文件?

如果32位计算机只能处理最大2 ^ 32的数字,为什么我可以写1000000000000(万亿)而我的计算机不崩溃?

一个人可以在64位计算机上使用4位,8位,16位或32位大小的指针吗?

如何创建32位远程Powershell会话(在64位计算机上)?

在64位计算机上编译32位内核

如何在64位计算机上构建32位deb文件?

如何在32位计算机上安装64位.deb文件?

在32位计算机上安装17.10

在仅32位UEFI的计算机上安装linux

如何从32位数字中提取位

无法在64位Windows计算机中启动32位RCP应用程序

C中32位数字的乘法

使用-m64在32位计算机上编译64位时出错

如何在64位计算机上以32位模式运行exe?

如何使用ODBC 64位在Windows 7 64位计算机中读取Excel文件

在64位计算机上创建32位initramfs

如何在64位计算机上测试特定于32位内核的syscall?

IBM iSeries是32位还是64位计算机?

如何使用zypper在64位SUSE计算机中安装32位软件包?

Wix:如何在64位计算机上写入32位寄存器

32位系统中的16位数字处理