PHP(或任何其他语言)中的Bit not操作

PHP(或任何其他语言)中的Bit not操作,php,Php,为什么这个代码返回-1 $a = 0; echo ~$a; $a=0; 回声~$a; 难道不应该还原位吗?如果将所有位都设置为2的补码整数,则得到−一, 让我用一个(非常小的)使用2的补码的两位有符号整数来说明: 00 → 0 01 → 1 10 → −2 11 → −1 这只是从0开始计算,超过了从1到1的溢出−第二章,结束于−1.如您所见,如果清除所有位,则得到0,如果将它们全部设置,则得到0−1(无论整数有多宽) (请注意,使用BASIC的人已经知道了这一点,因为没有布尔运算符,而

为什么这个代码返回-1

$a = 0; echo ~$a; $a=0; 回声~$a;
难道不应该还原位吗?

如果将所有位都设置为2的补码整数,则得到−一,

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

00 →  0
01 →  1
10 → −2
11 → −1
这只是从0开始计算,超过了从1到1的溢出−第二章,结束于−1.如您所见,如果清除所有位,则得到0,如果将它们全部设置,则得到0−1(无论整数有多宽)


(请注意,使用BASIC的人已经知道了这一点,因为没有布尔运算符,而且使用位运算符也能很好地工作,但事实上是这样的。)−1而不是1。)

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

0000 0000 0000 0000 0000 0000 0000 0000
因此,按位NOT将翻转所有符号,结果为-1(最左边的一个表示符号):


是的,它应该是,在二的补码系统中,一个所有位都被设置的数字等于-1,因为0的所有位都未设置,~$a的所有位都被设置


因此,代码的行为符合预期。

整数以2的补充形式存储

此表格可按如下方式填写:

1) 如果要存储的数字是正值,则存储其二进制值

乙二醇 $val=5

这里,$val包含5=0101//的原始二进制等价项。位数取决于具体情况

2) 如果你正在存储一个数字的负数,比如说-5,那么这两个恭维词将被存储

$val = -5;
这里发现了前2个对5的恭维,也就是简单的1对5+1的恭维

~ 0101 = 1010
特南加1

  1010 + 
     1
  -----
  1011
这个1011存储在$val中

同样,$val=0;00被存储

~$val=>11,在2的恭维形式中等于-2

最后,如果你仔细观察,你可能会问

那我怎么能代表11个呢?因为它的二进制值是1011,与2的comp中-5的值冲突

答案在于用来表示数字的位数

在2的complimgent形式中,如果有n位,则只能表示

-2^(n-1) to 2^(n-1) -1 ;

如果你不明白为什么所有的一位都是-1,问问你自己:如果你把1加进去,你会得到什么?答:它溢出,所有位都为零。我们有一个数字的名字,当你加上一个数字时,这个数字等于零-1.David,这对于二的补码是正确的,但对于符号位或一的补码(至少不是天真的)。从一个不熟悉计算机的人的角度来看,这两种选择都是同样可以解释的。在两个恭维语中,所有恭维语的一个位域是-1。“使用BASIC的人”我太年轻了,不记得了。至少在VisualBasic6之前是这样的,如果我没记错的话。VB.NET引入了短路
和ALSO
或ELSE
以及布尔类型。
-2^(n-1) to 2^(n-1) -1 ;