取反操作的两种方法

来源:互联网 发布:new balance淘宝 编辑:程序博客网 时间:2024/04/30 05:06

一个程序如下:
int x=10;
int y=~x;
printf("%d/n",y);

其运行结果为-11,为什么呢,让我们来看看:
(int)10 在32位计算机中表示为0x0000000A ,对其逐位求反后得到0xFFFFFFF5, 因为这个数的最高位为1,所以它是个负数,我们知道负数在机器中是以补码形式存在的。只要将这个补码转换成10进制数就可以了。步骤如下:

方法1: 232-0xFFFFFFF5 = 1+ (0xFFFFFFFF -0xFFFFFFF5) = 1 + 0x0000000A = 11,取其负号即可。

方法2: 首先求出其原码(按位取反加1)0x8000000A +1 = 0x8000000B,即为-11