我一直在对变量执行按位运算。
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。
有人可以解释一下它的工作原理吗?
我一直在对变量执行按位运算。
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。
有人可以解释一下它的工作原理吗?
~
是 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.
p
是 0b11,因此a
(假设 16 位 int)如果无符号则为 0b1111111111111100 = 0xFFFC,如果有符号则为 -3。
q
是 0b101,因此b
(假设为 16 位整数)如果无符号则为 0b1111111111111010 = 0xFFFA,如果有符号则为 -6。
在取 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 打印时,会考虑符号。