位运算有很多化腐朽为神奇的操作,取相反数就位列其中,我们总是用【取反+1】来求相反数,就如同公式一样使用,可否曾仔细琢磨过其中的原理呢?
为什么【取反+1】是相反数?
在数学中,互为相反数的两数相加为0,同理,在计算机中也是如此,正数 + 负数 = 0(式子中的负数为整数的相反数),但在数字在计算机并不是按原码存储
延伸:
计算机并不将数字按原码表示和存储,有符号数和无符号数都有各自的表示和存储规则,总而言之,正数是按补码表示和存储(正数的补码为自身,即原码),负数是按照表示和补码存储,补码 = 反码 + 1 = ~原码 + 1。
反码:符号位不变,其他位取反。
再回到原定义,
正数(原码) + 负数(原码) = 0 《==》 正数补码 + 负数补码 = 0 《==》正数(原码)+ 负数补码 = 0 《==》 正数(原码)+ (负数反码 + 1) = 0
如图,以5与-5为例子
我们可以清楚发现,对5取反正好获得-5的反码,再+1即-5的补码
再继续推导
正数(原码)+ (~正数 + 1) = 0,即可推恒等式 负数(相反数) = ~正数 + 1