3

我一直在对变量执行按位运算。

int p=3,q=5;
int a=~p,b=~q; //complement a and b
printf("%d %d\t%d %d",p,a,q,b);

'b' 的理论输出是 10,如果它是有符号的,它必须是 -2。但是输出是-6。

有人可以解释一下它的工作原理吗?

4

3 回答 3

7

~是 c(或 python)中的按位补码运算符,它本质上计算-x - 1.

所以一个表看起来像:

0  -1
1  -2
2  -3
3  -4 
4  -5 
5  -6

在二进制补码表示中,如果数字 x 的最高有效位为 1,则实际值为 -(~x + 1)。

例如,

0b11110000 = -(~0b1111 + 1) = -(15 + 1) = -16.

这是负数的自然表示,因为

0000001 =  1
0000000 =  0
1111111 = -1  (wrap around)
1111110 = -2
1111101 = -3 etc.

有关详细信息,请参阅http://en.wikipedia.org/wiki/Two%27s_complement

于 2012-11-07T08:37:27.243 回答
3

p是 0b11,因此a(假设 16 位 int)如果无符号则为 0b1111111111111100 = 0xFFFC,如果有符号则为 -3。

q是 0b101,因此b(假设为 16 位整数)如果无符号则为 0b1111111111111010 = 0xFFFA,如果有符号则为 -6。

于 2012-11-07T08:36:37.567 回答
1

在取 p(即 5)的补码时,您期望它是 1010。即 10。但事实是在一个补码操作期间,所有位都被反转。

考虑这个程序。

#include <stdio.h>

int main()
{

int p=5,q=3;
int a=~p,b=~q; //complement a and b
printf("%x %x\t%x %x",p,a,q,b);

return 0;
}

印刷

5 fffffffa  3 fffffffc

所以在使用 %d 打印时,会考虑符号。

于 2012-11-07T08:41:13.967 回答