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

2025-04-08 06:34:06
推荐回答(2个)
回答1:

在数值范围内,~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

回答2:

没错呀 .
$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 来算... 前面还有呢.