求补码的简便算法

xiaoxiao2021-02-28  138

对计算机来说,「对负数求最小正同余数(模为值位的容量)放入值位,符号位置为1」1 这样的求补码过程还是有些繁琐,同时这是一个非常基础的运算过程,一点点优化都能对计算机的计算效率有很大提升。

于是就有大牛把这个过程优化成「值位取反加一算法」2:原码的符号位不变,其余值位取反,最后加1,得到负数的补码。

这个算法在计算上变得非常便捷,极大地提高了计算效率。其实我们也可以在理解补码本质的基础上使用这个优化算法来计算补码,但最好不要只记这个而不去理解本质,因为虽然看起来简单,但是你确定一段时间不用后你还能记起它来?或者是自己能推导出来?

简便算法正确性的证明

为什么能这么优化呢?最小正同余数 = 值位取反加一,看上去是不是很神奇,下面证明一下

用3位二进制值位[abc]表示一个不会造成溢出的负数F: F=(a22+b21+c)(a,b,c0,1) 对F的值位取反 : F=(1a)22+(1b)21+(1c)=22+21+1(a22+b21+c)=231+F 3位二进制的模等于2^3 ,所以F的补码等于 F=F+23 把3式代入2式: F=231+F=F1 等价于 F=F+1 最小正同余数 = 值位取反加一 得证


详细阐述见计算机中整数为什么以「补码」的形式存储? ↩不管使用哪种计算方法,都可以计算到,-0的大小等于-模,也就是假设4位二进制,1位符号位,模是8,使用补码的表示范围是-8~7 ↩
转载请注明原文地址: https://www.6miu.com/read-39645.html

最新回复(0)