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

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.取反运算符进行逐项取反运算时,全部二进制都进行取反,包括符号位。

分清楚以上两点,什么时候符号位保留,什么时候符号位也取反,分清楚运用~时就不会出错了。