免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4784 | 回复: 14
打印 上一主题 下一主题

同样的代码,在linux和windows下的php异或结果不一样,为什么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-12 17:35 |只看该作者 |倒序浏览
代码是
<?
$a=-5547163286;
$b=173240;
$a ^= $b;
echo $a;
?>

在linux下结果是-2147310408
在windows下的结果是-1252022830

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

论坛徽章:
0
2 [报告]
发表于 2007-06-12 18:02 |只看该作者
这个应该不是系统的问题,应该是机器的问题吧.

论坛徽章:
0
3 [报告]
发表于 2007-06-12 18:07 |只看该作者
又跟进了一下,发送是溢出了
php中一个整数能表示的范围是2147483647~-2147483647
所以上面的赋值$a理论上来说是溢出了
但奇怪的是赋值后再echo $a,打印出来的还是所付的溢出值
why?
完全摸不着北了……

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
4 [报告]
发表于 2007-06-12 21:16 |只看该作者
整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。PHP 不支持无符号整数。

论坛徽章:
0
5 [报告]
发表于 2007-06-12 21:45 |只看该作者
to:HonestQiao
    版主,你好,跟平台有关就是跟操作系统有关了,对吧?
   既然存在溢出的问题,怎么我执行
   $a=-5547163286;
    $b=$a;
    echo $b; 的结果还是-5547163286;
   既然溢出了,赋值后,$b应该不是原来值了啊

[ 本帖最后由 dragonfont 于 2007-6-12 21:48 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-06-13 17:05 |只看该作者
再顶一下这个问题,看有没有人能解决

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
7 [报告]
发表于 2007-06-14 10:23 |只看该作者
http://cn.php.net/manual/zh/language.types.integer.php
结合:
http://cn.php.net/manual/zh/language.types.type-juggling.php
一起看:

你可以这么分别测试:

  1.    $a=-5547163286;
  2.    printf("%s\n",gettype($a));
  3.     $b=$a;
  4.    printf("%s\n",gettype($b));
复制代码


  1. $a=-5547163286;
  2.    printf("%s\n",gettype($a));
  3. $b=173240;
  4.    printf("%s\n",gettype($b));
  5. $a ^= $b;
  6.    printf("%s\n",gettype($a));
  7. echo $a;
复制代码

论坛徽章:
0
8 [报告]
发表于 2007-06-14 18:23 |只看该作者
按照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环境下进行大数异或会出现异常或错误
不知大家怎么看

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
9 [报告]
发表于 2007-06-14 21:46 |只看该作者
我的意思是说会进行数据类型转换啊。

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

[ 本帖最后由 HonestQiao 于 2007-6-14 21:49 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2007-09-06 23:02 |只看该作者
我也遇到了同样的问题

结论是:
到此为止。基本可以判定是由于服务器的原因
php中一个整数能表示的范围是2147483647~-2147483647
在linux环境下,php整数溢出的时候,其结果是不可靠
也就是说这个pr查询的东西只能使用在windows服务器上了…….

具体可以查询我的blog,地址是:http://www.ccvita.com/index.php/179.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP