php异或运算的不可靠性
本文最后更新于 6285 天前,其中的信息可能已经有所发展或是发生改变。

昨天写到

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

今天下班了就又来研究这个,在对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异或结果不一样,为什么?
代码是

在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
一起看:

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

评论

  1. jin
    17 年前
    2007-9-07 10:49:12

    php下有大数运算的专用函数:gmp以及bcmath。
    楼主试试这些,看是不是行?

  2. 博主
    17 年前
    2007-9-10 14:17:29

    貌似bcmath没有位运算吧 有空研究下

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇