Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP按位操作中出现意外结果_Php_Integer_Bit Manipulation_Bits - Fatal编程技术网

PHP按位操作中出现意外结果

PHP按位操作中出现意外结果,php,integer,bit-manipulation,bits,Php,Integer,Bit Manipulation,Bits,操作1539 | 0xfffff800在JavaScript和Python 2.7中返回-509。 在PHP中,我得到了4294966787 有人知道为什么吗?能向我解释一下吗。我也想知道我是如何在PHP中获得预期结果的。1539 | 0xfffff800=4294966787(=0xFFFFFE03) 这是完全正确的。因此,PHP是正确的 如果希望同时具有正整数和负整数,则需要某种机制来确定该数字是否为负。这通常是使用数字的2-补码来完成的。您可以通过将数字的所有位反转,然后向其添加1来对数字

操作
1539 | 0xfffff800
在JavaScript和Python 2.7中返回
-509
。 在PHP中,我得到了
4294966787


有人知道为什么吗?能向我解释一下吗。我也想知道我是如何在PHP中获得预期结果的。

1539 | 0xfffff800=4294966787(=0xFFFFFE03) 这是完全正确的。因此,PHP是正确的

如果希望同时具有正整数和负整数,则需要某种机制来确定该数字是否为负。这通常是使用数字的2-补码来完成的。您可以通过将数字的所有位反转,然后向其添加1来对数字求反。为了避免歧义,不能使用整数变量的所有位。在这种情况下,不能使用最高位。最高位保留为符号位。(如果你不这样做,你永远不知道你的数字是一个大的正数还是负数。)

例如,使用8位整数变量,可以表示0到255之间的数字。若您需要有符号的值,您可以表示从-128(1000 000二进制)到+127(0111111)的数字

在您的示例中,您有一个32位的数字,该数字具有其最高的位集。在Python和JavaScript中,它被解释为负数,因为它们显然有32位变量,并且在这里设置了最高位。他们把它解释为负数。所以,你的计算结果也是负数。
在您使用的PHP版本中,整数变量的长度似乎为64位,并且只使用较低的32位。最高位(第63位)未设置,因此PHP将此数字解释为正数。根据您想要实现的目标,您可能希望用1填充从第32位到第63位的所有位,这将产生一个负数…

请向我们显示您用于获得此结果的完整代码!PHP使用64位整数。就这么简单,非常感谢。1539 | 0xFFFFFFFFF800工作正常。请注意,这取决于平台。我使用PHP5.4.30在32位Windows下获得-509。