php 异或运算,php异或运算的不可靠性

昨天写到不过貌似在服务器上有点问题,总是不能获得,而本机调试没有问题,不解中,而php的allow_url_fopen 为on,而且file函数测试也成功了,比较诡异,有时间再搞。

今天下班了就又来研究这个,在对pr.php文件仔细分析的过程中,发现最后的焦点问题处在

$a ^= (zeroFill($c,13)) 这一句上,举例说明吧< ?php

$a = -3862272608;

$b = 471468;

$c = $a ^ $b;

echo $c;

echo '
本地这是5.2的php,Win XP系统,$c的值是432886796';

echo '
服务器上4.4的php,CentOs系统,$c的值是-2147012180';

?>

看上面代码,你也可以自己测试下,linux和windows系统的结果是不一样的

让我很郁闷,echo get_cfg_var('precision'); 用这个查看精度也是一样的

然后百度的时候发现了cu的这篇帖子摘录如下:

楼主说同样的代码,在linux和windows下的php异或结果不一样,为什么?

代码是

< ?

$a=-5547163286;

$b=173240;

$a ^= $b;

echo $a;

?>

在linux下结果是-2147310408

在windows下的结果是-1252022830

怎么回事?大家遇到过没有?

二楼这个应该不是系统的问题,应该是机器的问题吧.

三楼又跟进了一下,发送是溢出了

php中一个整数能表示的范围是2147483647~-2147483647

所以上面的赋值$a理论上来说是溢出了

但奇怪的是赋值后再echo $a,打印出来的还是所付的溢出值

why?

完全摸不着北了……

四楼整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。PHP 不支持无符号整数。

五楼to:HonestQiao

版主,你好,跟平台有关就是跟操作系统有关了,对吧?

既然存在溢出的问题,怎么我执行

$a=-5547163286;

$b=$a;

echo $b; 的结果还是-5547163286;

既然溢出了,赋值后,$b应该不是原来值了啊

六楼再顶一下这个问题,看有没有人能解决

七楼http://cn.php.net/manual/zh/language.types.integer.php

结合:

http://cn.php.net/manual/zh/language.types.type-juggling.php

一起看:

你可以这么分别测试:$a=-5547163286;

printf("%s\n",gettype($a));

$b=$a;

printf("%s\n",gettype($b));$a=-5547163286;

printf("%s\n",gettype($a));

$b=173240;

printf("%s\n",gettype($b));

$a ^= $b;

printf("%s\n",gettype($a));

echo $a;

八楼按照HonestQiao 的提示做了测试,结果如下:

测试1:

< ?

$a=-5547163286;

printf("%s\n",gettype($a));

$b=173240;

printf("%s\n",gettype($b));

$a ^= $b ;

printf("%s\n",gettype($a));

echo $a;

?>

结果:double integer integer -2147310408

测试2:

< ?

$a=-5547163286;

printf("%s\n",gettype($a));

$b=(double)173240;

printf("%s\n",gettype($b));

$a ^= $b;

printf("%s\n",gettype($a));

echo $a;

?>

结果:double double integer -2147310408

测试3:

< ?

$a=-5547163286;

printf("%s\n",gettype($a));

$b=(double)173240;

printf("%s\n",gettype($b));

$a = (double)($a ^ $b);

printf("%s\n",gettype($a));

echo $a;

?>

结果:double double double -2147310408

运算的结果都是-2147310408,是个错误的值

我现在基本认为php在linux环境下进行大数异或会出现异常或错误

不知大家怎么看

九楼我的意思是说会进行数据类型转换啊。

同时,在超出范围的时候,行为是不可预测的。

然后我又跑去回了一贴

到此为止。基本可以判定是由于服务器的原因

php中一个整数能表示的范围是2147483647~-2147483647

在linux环境下,php整数溢出的时候,其结果是不可靠

也就是说这个pr查询的东西只能使用在windows服务器上了.......

Tags: none

版权声明:原创作品,欢迎转载,转载时请务必以超链接形式标明文章原始地址、作者信息和本声明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值