PHP 32 位版本的坑

我使用下面的代码,结果如下:

$int1=0x2234567890123456;
$int2=0x2232123456322135;
print ("\t    \t".base_convert($int1,10,2)."\tint1\n\t    \t".base_convert($int2,10,2)."\tint2\n");
结果:
            1000110000011001111101011010010000011000111000000110    int1
            1000110000010000101011001101111010010000001010100010    int2

其中二进制长 52 bit,理应 62 bit ,为什么呢,我百思不得其解,上网查了许久,好像都没这个内容。心想:要不这个太难,要不根本简单的不值一提,这个肯定不难,那为什么网上没有这个内容或少之又少呢?额?会不会是版本问题,我的PHP_INT_MAX 是 32 位的,不过为什么能表示 52 bit 二进制呢,虽然不准确,不管了。
于是我在网上输入 》在线PHP测试 或直接(http://www.dooccn.com/php5.6/)
在网上输入这行代码:
结果是:(注:网上的经测试是 64 bit 版本)

            10001000110100010101100111100010010000000100100011010001010110  int1
            10001000110010000100100011010001010110001100100010000100110101  int2

这个结果就正确了。哎,真吭啊!!
经过猜想应该是 0x2234567890123456 先转成 64 bit 大整数,因为超过了 PHP_INT_MAX 所以自动转成 浮点数(用科学计数法表示),然后转成 二进制 丧失了 精度,不过这个精度丧失的有点大,哈哈。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。