按位运算符的说明

时间:2012-11-07 08:31:53

标签: c

我一直在对变量执行按位操作。

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。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

p为0b11,因此a将为(假设为16位int)0b1111111111111100 = 0xFFFC(如果未签名)和-3(如果已签名)。

q为0b101,因此b将为(假设为16位int)0b1111111111111010 = 0xFFFA(如果是无符号)和-6(如果已签名)。

答案 2 :(得分: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打印时,会考虑使用符号。