PHP按位运算的意外结果

时间:2015-02-03 18:02:22

标签: php integer bit-manipulation bits

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

有人知道为什么并且可以向我解释。我很想知道如何在PHP中获得预期的结果。

1 个答案:

答案 0 :(得分:1)

1539 | 0xfffff800 = 4294966787(= 0xFFFFFE03) 这是完全正确的。所以,PHP是对的。

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

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

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