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。