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

ava*_*sin 1 php bit-manipulation

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

echo ~1; // gives -2
echo ~2; // gives -3
Run Code Online (Sandbox Code Playgroud)

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

Raj*_*jan 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.