dragonfont 发表于 2007-06-12 17:35

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

代码是
<?
$a=-5547163286;
$b=173240;
$a ^= $b;
echo $a;
?>

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

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

jlspzxs 发表于 2007-06-12 18:02

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

dragonfont 发表于 2007-06-12 18:07

又跟进了一下,发送是溢出了
php中一个整数能表示的范围是2147483647~-2147483647
所以上面的赋值$a理论上来说是溢出了
但奇怪的是赋值后再echo $a,打印出来的还是所付的溢出值
why?
完全摸不着北了……

HonestQiao 发表于 2007-06-12 21:16

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

dragonfont 发表于 2007-06-12 21:45

to:HonestQiao
    版主,你好,跟平台有关就是跟操作系统有关了,对吧?
   既然存在溢出的问题,怎么我执行
   $a=-5547163286;
    $b=$a;
    echo $b; 的结果还是-5547163286;
   既然溢出了,赋值后,$b应该不是原来值了啊

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

dragonfont 发表于 2007-06-13 17:05

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

HonestQiao 发表于 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
一起看:

你可以这么分别测试:

   $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;

dragonfont 发表于 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环境下进行大数异或会出现异常或错误
不知大家怎么看

HonestQiao 发表于 2007-06-14 21:46

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

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

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

僭燮水 发表于 2007-09-06 23:02

我也遇到了同样的问题

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

具体可以查询我的blog,地址是:http://www.ccvita.com/index.php/179.html
页: [1] 2
查看完整版本: 同样的代码,在linux和windows下的php异或结果不一样,为什么?