考虑:
php > $a = 12; // 1100
php > echo ~$a;
-13
我希望 的倒数1100是0011(直接)或11110011(整个字节)。这会给3or一个结果243。从何而来-13?
同样,为了更好地衡量,相同类型和解释的另一个意外结果:
php > $b =  6; // 0110
php > echo ~$b;
-7
为什么-7?
考虑:
php > $a = 12; // 1100
php > echo ~$a;
-13
我希望 的倒数1100是0011(直接)或11110011(整个字节)。这会给3or一个结果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?
6is 00000000000000000000000000000110, so ~6is ~00000000000000000000000000000110, 那等于11111111111111111111111111111001. 因为使用有符号数据类型,所以第一位指示数字是正数还是负数(正数 =0和负数 = 1)。因为它是二进制补码,所以您应该使用这种方式将二进制数转换为十进制数:
0000000000000000000000000000011000000000000000000000000000000110(正二进制数)转换为十进制数。你得到66:你得到7-7