~8为什么等于-9,怎么得来的

img

8的二进制是0000 1000,~是每一位取反,也就是1111 0111,最高位是1,所以是负数,负数是以补码的形式存放的,所以要得到源码,除符号位所有位按位取反,再加1就是源码,也就是11110111取反变成1000 1000,再加1,就是1000 1001,也就是-9

计算机存储都是以补码的形式存储的。以16位的int来看 8 = 0000 0000 0000 1000,~是取反,也就是1变0,0变1,得到 1111 1111 1111 0111,最高位是1,说明为负数,负数需要求出原码,符号位不变取反+1就是原码 = 1000 0000 0000 1000 + 1 = 1000 0000 0000 1001 = - (8 + 1) = -9

一言以蔽之,~运算符是对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