【C语言取反运算符】~2是多少?~-5是多少?

标题的答案:
~2=-3
~-3=2
原理是什么?我们先来看这个程序及输出的结果:
【C语言取反运算符】~2是多少?~-5是多少?
容易总结出这样一个结论:~i=-i-1
为什么呢?
一言以蔽之,~运算符是对i的补码(含符号位)进行取反。
2的原码是0000 0010 正数补码是其本身0000 0010
取反(含符号位)后补码变成1111 1101 此时补码为负数,换成原码要符号位不变,减去1,再取反,即原码成了1000 0011 即为-3

-5的原码是1000 0101 负数的补码是原码符号位不变、取反并+1,因此补码是1111 1011 ,对补码取反(含符号位) 此时补码为0000 0100 补码此时符号位是正,因此原码也是0000 0100 即为4

因此,~i=-i-1。

如果想要更充分的理解这个结论,来考虑一下,对任意一个二进制数取反的含义是什么?1010取反是0101
0100取反是1011,容易看出取反的本质就是找一个数和原来的相加得到每一位均为1的数,因此要找的数就是2^M-1-a,M是位数(例如1010有四位,15-10=5,5就是0101)