负数的按位与运算:
按位与运算是按照数据的内部二进制形式进行运算的。若是两个负数,则是按二进制补码形式进行按位与。所得结果若用有符号整型变量存储,则内部形式仍看作二进制补码。如果用格式符%d输出,输出结果为十进制真值(不应该称为十进制原码)。
例如:
-
#include <stdio.h>
-
main()
-
{short int a=-2,b=-3,c;
-
a=-2;//a的补码1111 1111 1111 1110
-
b=-3;//b的补码1111 1111 1111 1101
-
c=a&b;//c的补码1111 1111 1111 1100
-
printf("%hd\n",c);//c的真值-4
}
short a=-109;//补码 1111 1111 1001 0011 ,原码 1000 0000 0110 1101
short b=255
c=a&b //149
扫描二维码关注公众号,回复:
4808392 查看本文章
----------------
下面是另外一篇文章
负数的运算是以补码形式进行的,如果运算结果首位为1,结果也需要求一次补码
如何求补码
正数的补码还是自身,负数的补码:首位的1不变,其余位取反加1(更方便的一种记法是从右向左遇到第一个1为止,这个1前面的位取反,首位不动)
以-10为例:
1000 0000 0000 0000 0000 0000 0000 1010
- 1
最右边的1和1后面的不变,首位不变,其余位取反:
1111 1111 1111 1111 1111 1111 1111 0110
- 1
负数的异或运算
以 10 ^ -10
为例:
0000 0000 0000 0000 0000 0000 0000 1010
^ 1111 1111 1111 1111 1111 1111 1111 0110
= 1111 1111 1111 1111 1111 1111 1111 1100
- 1
- 2
- 3
得到的结果首位为1,所以再求一次补码:
1000 0000 0000 0000 0000 0000 0000 0100
- 1
即 -4
转自https://blog.csdn.net/huangquanlong/article/details/79170101