1

我今天一直在尝试更多地了解 PHP 的按位运算符,但我在使用 ~ 运算符时遇到了一些麻烦。按照在线教程,我看到它反转了数字中的设置位。例如,如果您有一个等于 7 的字节:

    |------------------------------------|
    | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
    |------------------------------------|
    |  0  | 0  | 0  | 0  | 0 | 1 | 1 | 1 |
    |------------------------------------|

并使用〜7反转它:

    |------------------------------------|
    | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
    |------------------------------------|
    |  1  | 1  | 1  | 1  | 1 | 0 | 0 | 0 |
    |------------------------------------|

那不等于248而不是-8吗?

4

2 回答 2

1

不,原因是二进制补码

每个数字的第一位都有一个负值(PHP 中的 -2 32,因为 PHP 使用 32 位(= 4 字节)数字)。当该位设置为 1 时,整数将变为负数。因此,当使用非运算符 ( ~) 时,该位将发生变化,数字将变为负数。

于 2012-10-28T21:18:23.283 回答
0

最左边的位表示符号是二进制补码,0 表示正数,1 表示负数。二进制补码是通过反转位并加 1 来计算的。在这种情况下,它是 1111000(除了符号位),然后减去 1(1110111)并反转它(0001000,负),所以它是 -8。在 C 中,带符号整数的范围是从 -2^15-1 到 2^15。

于 2013-03-08T16:30:50.697 回答