为什么在php中否定数字(〜运算符)会产生如此奇怪的结果?

时间:2013-07-03 10:13:37

标签: php bit-manipulation

我尝试执行以下代码并得到奇怪的结果:

echo ~1; // gives -2
echo ~2; // gives -3

也许有一点,描述数字是正还是负?

2 个答案:

答案 0 :(得分:6)

没有神奇或奇怪的输出,但它来自否定的定义

十进制数的按位补码是数字减1的否定

来自手册: -

将负十进制数(即:-3)转换为二进制需要3个步骤: -

  • 1)将十进制数的正数转换为二进制数(即:3 = 0011)

  • 2)翻转位(即:0011变为1100)

  • 3)加1(即:1100 + 0001 = 1101)

你可能想知道1101 = -3是怎么回事。 PHP使用方法“2的补码”来呈现负二进制数。如果最左边的位是1,那么二进制数是负数,你翻转这些位并加1.如果它是0那么它是正数而你不需要做任何事情。所以0010将是正数2.如果它是1101,则它是负数,你将这些位翻转为0010.加1,你得到的0011等于-3。

答案 1 :(得分:1)

运算符~计算数字的二进制补码。

您可以找到有关这两者的补充以及如何计算它的更多信息on wikipedia