读书人

取反操作,该怎么解决

发布时间: 2013-04-07 12:50:11 作者: rapoo

取反操作
int a = 13;
int z = ~a;

~a为什么会是14?

13: 0000 1101 = 8+4+1 =13
~a 1111 0010 = ?? ,为什么会是-14? 如何计算的??麻烦大大们给出详细介绍,万分感激。 取反操作
[解决办法]
设有一个有符号整数n,从bit的角度来看,n + (~n)结果为全1,而全1表示-1,因此~n = (-1) - n。
[解决办法]
负数是以补码形式保存的,所以要把转换成原码,补码= 原码取反+1;后面你自己计算吧
[解决办法]
a: 00000000 00000000 00000000 00001101
取反后 00000000 00000000 00000000 11110010
1表示负号了,在计算机中以补码存在,符号位不变,其他取反加1

变成00000000 00000000 00000000 10001110
[解决办法]
0xf2就是-14
[解决办法]
为了便于问题描述,这里假设int是8位的,括号()中为二进制表示。
int a = 13;
int z = ~a;

a = 13 (00001101)
z = ~a (11110010) //~的意思是按位取反
这样 z = (11110010)

从有符号的角度来看,z的最高位为1,所以首先可以判断它是负数,然后它的数值等于取反加一,因此:
z = (11110010)
z = -(~(11110010) + 1)
z = -(00001101 + 1)
z = -(00001110)
z = -14
[解决办法]
在计算机系统中数用补码表示。

正数的补码就是原码。

负数的原码为其绝对值的原码最高位(符号位)变为1,负数的补码为原码符号位不变,其余位取反,然后整个数加1.

如果你的系统int为1个字节。那么
a=13=00001101
z=~a=11110010
将11110010按照8位有符号数解释,
先确定正负,符号位为1,是负数。
整个数减1,等于11110001,
再符号位不变,其余位取反,等于10001110,即该数绝对值为14,
所以该数为-14.
[解决办法]
记住:任何整数a,都有a + ~a + 1 = 0;
所以~a = -1-a=-1-13=-14

~(-44)= -1-(-44)= 43

读书人网 >C++

热点推荐