2012-11-01 73 views
6

谁能告诉下面的代码

<? $temp = 0; echo ~$temp; ?> 
    //instead of 1 it displays -1 

回答

1

按位而不是(〜):

此反转其操作数中的每一位。如果操作数是浮点值,则在计算之前将其截断为整数。如果操作数在0到4294967295之间(0xffffffff),它将被视为一个无符号的32位值。否则,它被视为一个有符号的64位值

它是因为你实际上处理一个完整的32位无符号整数与NOT。这也就意味着你不能简单的颠倒0001,但反转00000000000000000000000000000001

成为11111111111111111111111111111110

实质上这是数+ 1和否定。所以1成为 - (NUM + 1),这是-1或二进制(无符号)

例如: - $温度= 1;回声〜$温度;打印-2 // - (n ++)

4
echo ~$temp; 
    ^bitwise not operator 

假设32位的内部程序,Bitwise0000FFFF(全1的),这是-1,在符号的int的情况下。


另一种方式来看待它:什么~所做的是给你(One's complement)

为了得到一个数的负数,你把2的补,这仅仅是在 1's complement + 1

所以,

(1's complement of 0) + 1 = 0 //negative 0 is 0 
hence, 1's complement of 0 = -1 
+0

来自克苏鲁的好回答。 –

+0

这个标志很重要;) – Christoph

0

因为~0-1

~运算符恢复0的每一位。

的关系是:-$temp === ~$temp + 1

相关问题