0

考虑:

php > $a = 12; // 1100
php > echo ~$a;
-13

我希望 的倒数11000011(直接)或11110011(整个字节)。这会给3or一个结果243。从何而来-13

同样,为了更好地衡量,相同类型和解释的另一个意外结果:

php > $b =  6; // 0110
php > echo ~$b;
-7

为什么-7

4

2 回答 2

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 将其解释为负值,使用二进制补码表示存储。为了找出负值的模,存储在这个符号中,我们

  1. 反转数字:

110

  1. 将结果加一:

111

这给了我们 7

所以,值为-7

http://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

于 2013-08-25T16:53:05.603 回答
1

为什么-7?

6is 00000000000000000000000000000110, so ~6is ~00000000000000000000000000000110, 那等于11111111111111111111111111111001. 因为使用有符号数据类型,所以第一位指示数字是正数还是负数(正数 =0和负数 = 1)。因为它是二进制补码,所以您应该使用这种方式将二进制数转换为十进制数:

  1. 反转二进制数。你得到00000000000000000000000000000110
  2. 00000000000000000000000000000110(正二进制数)转换为十进制数。你得到6
  3. 加起来6:你得到7
  4. 让它消极:你得到-7
于 2013-08-25T16:49:30.617 回答