PHP 按位取反 运算符(~) 到底怎么算出来的? $a = 8 $b = ~$a echo $b 结果是 - 9

8的 二进制我手动算了一下....
2 4 0
2 2 0
2 1 0
8的二进制是 1000, (1*2的三次方 + 0*2的二次方 + 0*2的一次方+0*2的零次方)= 8
为什么...
运算符( ~ )后 $b的值 变为: -9 呢???

在数值范围内,~a = -(a+1)

8的二进制是1000,补满32位,也就是前面28个0 1000
取反后 28个1 0111
第一位是符号位 1代表负数,剩下的27个1 0111
负数是用补码表示的,补码是原码取反+1,也就是说 27个1 0111 是某个数的补码,那倒推回去,这个数就是补码-1后取反,也就是 27个1 0110取反,得到27个0 1001,也就是9,再加上前面的符号位,得到-9
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-24
没错呀 .
<?php
$num = 8;
$format = '%0' . (PHP_INT_SIZE * 8) . 'b';
$bin = sprintf($format, $num);
echo "bin: $bin\n";
$bin = sprintf($format, ~$num);
echo "bin: $bin\n";
?>
输出结果
---------- php53 ----------
bin: 00000000000000000000000000001000
bin: 11111111111111111111111111110111

输出完成 (耗时 0 秒) - 正常终止
~ $num Not(按位非) 将 $num 中为 0 的位设为 1,反之亦然。
不能单拿 1000 来算... 前面还有呢.
相似回答