C语言学习—运算符—“~”取反符号的理解

5~ = -6;-5~ = 4;
因为数据在计算机中是以二进制存放的。要知道原理,我们得先了解正负数在计算机中的存放形式:

正数:原码=反码=补码
负数:反码=原码取反;补码=反码+1;负数在计算机的存储方式是以补码对形式存在的。

先看一下正数的取反符~的运算:
以5为例:
5是正数的原码=反码=补码(不用变换):
原码:
00000000 00000000 00000000 00000101
5“~”取反运算(逐位取反,包括符位):
11111111 11111111 11111111 11111010
取反后的二进制是负数,所以要以补码的形式存放,所以将其转换成补码:
原码取反(不是取反运算,不包括符号位,符号位保留):
10000000 00000000 00000000 00000101
如何+1得到补码:
10000000 00000000 00000000 00000110
这样就得到一个负数-6了。这就是正数取反的运行过程。

再来看一下负数进行取反运算符运算过程:
以-5为例:
先写出-5的原码:
10000000 00000000 00000000 00000101
二进制符号位有负数,所以我们要先求出他的补码才进行~取反运算符的运算
反码=原码(不包括符号位,符号位保留)逐项取反:
11111111 11111111 11111111 11111010
补码=反码+1:
11111111 11111111 11111111 11111011
~进行取反运算符的运算,逐项取反(包括符号位):
00000000 00000000 00000000 00000100
这样就得到一个+4了。

总结:
1.取反运算符运算时,负数进行取反的时候要保留符号位,符号位不变;
2.取反运算符进行逐项取反运算时,全部二进制都进行取反,包括符号位。
分清楚以上两点,什么时候符号位保留,什么时候符号位也取反,分清楚运用~时就不会出错了。

更多推荐

C语言学习—运算符—“~”取反符号的理解