为什么这段代码会返回-1?
$a = 0; echo ~$a;
是不是没有想要恢复这些位?
答案 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 ;