des - 怎么可以让php代码:62837 << -16 在windows和linux中得到相同的结果?
PHP中文网
PHP中文网 2017-04-10 18:09:39
0
3
429

进行des加密操作,发现在windows和linux里得到的结果不一样,发现是createkey过程中有这个运算,从这里开始不一样的。

网络查询得知是int溢出导致,windows下是正确的。建议通过gmp扩展来操作,但是并未找到具体用法,求指教

win的结果:-176881664
lin的结果:-759700962142060544

@eechen

PHP中文网
PHP中文网

认证0级讲师

全部回覆(3)
Ty80

恭喜你掉到php的一个大坑了。

如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。

就是这个问题导致了各种匪夷所思的问题。

PHP 不支持无符号整数。

引用php原文

然而,你出现此问题是因为你两个系统的long型(php的int型在内核中均为long型)长度不一致(因为系统位数不一样)。
所以,你如要想解决此问题,就必须手动处理int到uint。

$flag=$int&0x80000000;
//取出符号位,判断是否是负数,溢出int范围,但没溢出uint范围时,符号位为1,即为负数
if($flag){
    $int ^= 0xffffffff;
    $int += 1;
}

BTW,最新的php7修正了此问题,但php中无法移位一个负数。

Peter_Zhu

不知道这段代码是从何而来的,左右移负数的代码是由CPU完成运算的,所以这里完全依赖机器,与系统关系都不大,看看能不能修正这段代码,或者只能是使用其他方法来代替左右移负数了。

小葫芦

所以从 php7 开始,位移一个负数会直接报错...

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!