在64位计算机上
(1 ^ 2489596804)
给出-1805370491
作为回应。但是,当我在32位PHP机器上执行此操作时,我得到2489596805
作为响应。
因此,我尝试使用gmp_strval(gmp_xor(1,2489596804))
在32位计算机上运行它,但它也会产生2489596805
。那么什么事,我怎样才能得到正确的答案?
更新:我刚刚注意到64位结果是从中减去32位最大值得到的结果(4294967295
)。
答案 0 :(得分:1)
这是相同的结果,只是解释不同:
0x94643B85 = 2489596805 (unsigned 32-bit integer)
0x94643B85 = -1805370491 (signed 32-bit integer)
您在64位计算机上看到负值的原因是您将该结果解释为带符号的32位整数。
如果你真的想在两种解释之间进行转换,我认为你必须自己做。一个简单的方法就是这样:
<?php
function toSigned($value) {
if ($value <= 2147483647)
return $value;
return $value - 4294967295 + 1;
}
function toUnsigned($value) {
if ($value >= 0)
return $value;
return $value + 4294967295 - 1;
}