这个题目比较干脆,直接是~0 == -1,有的时候我们不明白,为什么0b 1111 1111在内存中代表-1,因为他无论如何也是一个很大的负数才对。
可是实际上,负数在内存中是按照补码的形式存储的,也就是说0b 1111 1111是一个补码,那么它的反码就是0b 1111 1110,原码就是0b 1000 0001,也就是-1(注意负数求反码补码的时候符号位不变)
结论
- 0b 1111 1111 == -1 (~0)
- 0b 1111 1110 == -2 (~1)
- 0b 1111 1101 == -3 (~2)
可以把它当做一个公式 ~a == -【a+1】
补充说明
为什么整数要在内存中按照补码储存。因为正数的原码反码补码都一样,所以我们主要讨论问什么负数在内存中按照补码方式存储。
采用补码的原因或好处如下,采用补码运算具有如下两个特征:
1)因为使用补码可以将符号位和其他位统一处理,同时,减法也可以按加法来处理,即如果是补码表示的数,不管是加减法都直接用加法运算即可实现。
2)两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
这样的运算有两个好处:
1)使符号位能与有效值部分一起参加运算,从而简化运算规则。从而可以简化运算器的结构,提高运算速度。(减法运算可以用加法运算表示出来)
2)加法运算比减法运算更易于实现。使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。
下图最能说明为什么用补码可以使整数的减法运算(即负数的运算)变为加法运算: