考虑:
php > $a = 12; // 1100
php > echo ~$a;
-13
我希望 的倒数1100
是0011
(直接)或11110011
(整个字节)。这会给3
or一个结果243
。从何而来-13
?
同样,为了更好地衡量,相同类型和解释的另一个意外结果:
php > $b = 6; // 0110
php > echo ~$b;
-7
为什么-7
?
考虑:
php > $a = 12; // 1100
php > echo ~$a;
-13
我希望 的倒数1100
是0011
(直接)或11110011
(整个字节)。这会给3
or一个结果243
。从何而来-13
?
同样,为了更好地衡量,相同类型和解释的另一个意外结果:
php > $b = 6; // 0110
php > echo ~$b;
-7
为什么-7
?
看看这段代码:
<?php
$val = 6;
print "$val = ".decbin($val);
print "\n";
$val = ~$val;
print "$val = ".decbin($val);
它打印
6 = 110
-7 = 11111111111111111111111111111001
起初你有 110。由于我的 php 使用 32 位,在反转所有位之后,我们得到了这个巨大的数字。由于第 1 位为 1,php 将其解释为负值,使用二进制补码表示存储。为了找出负值的模,存储在这个符号中,我们
110
111
这给了我们 7
所以,值为-7
为什么-7?
6
is 00000000000000000000000000000110
, so ~6
is ~00000000000000000000000000000110
, 那等于11111111111111111111111111111001
. 因为使用有符号数据类型,所以第一位指示数字是正数还是负数(正数 =0
和负数 = 1
)。因为它是二进制补码,所以您应该使用这种方式将二进制数转换为十进制数:
00000000000000000000000000000110
00000000000000000000000000000110
(正二进制数)转换为十进制数。你得到6
6
:你得到7
-7