考虑:
php > $a = 12; // 1100
php > echo ~$a;
-13
我希望1100
的倒数可以是0011
(直接)或11110011
(整个字节)。这会给3
或243
带来结果。从哪来来-13
?
同样,为了更好的衡量,同一类型和解释的另一个意外结果:
php > $b = 6; // 0110
php > echo ~$b;
-7
为什么-7
?
答案 0 :(得分:1)
为什么-7?
6
为00000000000000000000000000000110
,因此~6
为~00000000000000000000000000000110
,且等于11111111111111111111111111111001
。由于使用了带符号的数据类型,因此第一位指示数字是正数还是负数(正数= 0
和负数= 1
)。因为它是Two's complement,所以你应该用这种方式将二进制数转换为十进制:
00000000000000000000000000000110
00000000000000000000000000000110
(正二进制数)转换为十进制数。得到6
6
一个:您获得7
-7
答案 1 :(得分:1)
看看这段代码:
<?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