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

时间:2012-01-09 07:17:28

标签: php

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

$a = 0; 
echo ~$a;

是不是没有想要恢复这些位?

4 个答案:

答案 0 :(得分:8)

如果将所有位设置为2的补码整数,则得-1。

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

00 →  0
01 →  1
10 → −2
11 → −1

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

(请注意,使用BASIC的人已经知道了这一点,因为没有布尔运算符,并且对于按位运算符也可以正常工作,除了True是-1而不是1。)

答案 1 :(得分:5)

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

0000 0000 0000 0000 0000 0000 0000 0000

所以按位NOT翻转所有,导致two's complement为-1(最左边的一个代表符号):

1111 1111 1111 1111 1111 1111 1111 1111

答案 2 :(得分:2)

是的,并且在二进制补码数系统中,所有位设置的数字等于 -1 ,并且由于0全部未设置,所以〜$ a将设置其所有位。

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

答案 3 :(得分:0)

整数以2的赞美形式存储。

此表格可以概述如下:

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

例如     $ val = 5;

这里$ val包含ordiary二进制等值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的complimwent形式,如果有n位,那么你只能表示来自

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