在PHP(或任何其他语言)可能没有操作

dan*_*car 2 php

为什么这段代码返回-1?

$a = 0; 
echo ~$a;

是不是没有想要还原位?

Joe*_*oey 8

如果将所有位设置为二进制补码整数,则得到-1.

让我用一个(非常小的)使用二进制补码的两位有符号整数来说明:

00 ?  0
01 ?  1
10 ? ?2
11 ? ?1
Run Code Online (Sandbox Code Playgroud)

这只是从0开始计数,经过溢出从1到-2并以-1结束.如您所见,如果清除所有位,则得到0,如果全部设置,则得到-1(无论整数有多宽).

(请注意,使用BASIC的人已经知道这一点,因为没有布尔运算符,并且对于按位运算符,事情也同样有效,除了True是-1而不是1.)


Bol*_*ock 5

该零实际上由32个零位表示,因为PHP整数类型是32位有符号整数,而不是单个位:

0000 0000 0000 0000 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

所以按位NOT翻转所有这些,导致两个补码为-1(最左边的一个代表符号):

1111 1111 1111 1111 1111 1111 1111 1111
Run Code Online (Sandbox Code Playgroud)

  • 如果你不明白为什么所有的比特都是-1,那就问问自己:如果你加1,你会得到什么?答:它溢出,所有位都为零.我们有一个名称,当你向它添加一个时给出零的数字... -1. (4认同)