首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

取反操作,该怎么解决

2013-04-07 
取反操作int a 13int z ~a~a为什么会是14?13: 0000 1101 8+4+1 13~a1111 0010 ??,为什么会是-14?

取反操作
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

热点排行