您当前的位置: 首页 > 网站编程 > PHP教程 > php异或运算的不可靠性

php异或运算的不可靠性

作者:xiaoxiao 来源:未知 发布时间: 2013-12-02 13:42 点击:
今天下班了就又来研究这个,在对pr.php文件仔细分析的过程中,发现最后的焦点问题处在 $a ^= (zeroFill($c,13)) 这一句上,举例说明吧 ?php $a = -3862272608; $b = 471468; $c = $a ^ $b; echo $c; echo 'br /本地这是5.2的php,Win XP系统,$c的值是432886796'; echo

php异或运算的不可靠性

  今天下班了就又来研究这个,在对pr.php文件仔细分析的过程中,发现最后的焦点问题处在
  $a ^= (zeroFill($c,13)) 这一句上,举例说明吧
  < ?php
  $a = -3862272608;
  $b = 471468;
  $c = $a ^ $b;
  echo $c;
  
  echo '<br />本地这是5.2的php,Win XP系统,$c的值是432886796';
  echo '<br />服务器上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服务器上了.......

分享到:
本文"php异或运算的不可靠性"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4