对计算机来说,「对负数求最小正同余数(模为值位的容量)放入值位,符号位置为1」1 这样的求补码过程还是有些繁琐,同时这是一个非常基础的运算过程,一点点优化都能对计算机的计算效率有很大提升。
于是就有大牛把这个过程优化成「值位取反加一算法」2:原码的符号位不变,其余值位取反,最后加1,得到负数的补码。
这个算法在计算上变得非常便捷,极大地提高了计算效率。其实我们也可以在理解补码本质的基础上使用这个优化算法来计算补码,但最好不要只记这个而不去理解本质,因为虽然看起来简单,但是你确定一段时间不用后你还能记起它来?或者是自己能推导出来?
简便算法正确性的证明
为什么能这么优化呢?最小正同余数 = 值位取反加一
,看上去是不是很神奇,下面证明一下
- 用3位二进制值位[abc]表示一个不会造成溢出的负数F:
F=−(a∗22+b∗21+c)10(a,b,c∈0,1)