计算机基础—任意整数补码的快速计算方法

       这几天读《深入理解计算机系统》(英文名: Computer Systems : A Programmer's Perspective)一书时,再次复习到了整数的各种类型及其表示方法。本科学习计算机组成原理时,学过原码、反码、补码的概念,可惜应付完考试就基本忘光了。。。 

       之前只是依稀记得对于有符号整数,要用最高位来表示符号,在不考虑溢出的情况下:

     1)对于有符号正数:最高位为0,原码、反码、补码均等于原码

     2)对于有符号负数:最高位为1,原码除符号位外,其余位与其相对应的正数原码对应位相等,反码等于原码符号位不变,其余位取反,补码等于反码+1,也即其原码符号位不变,其余位取反后再加1

        当时只是死背规律,不清楚为啥补码可以通过做这样”变换“得到,每次计算补码时,硬套”公式“,先写原码再反转+1,效率极低。。。

        阅读了《深入理解计算机系统》第2章第2小节,现在终于掌握了补码的快速计算方法(非计算机科班出身,现在才搞清计算方法,自己都觉得汗颜 o_o),作为笔记,记录于此。

        首先需要明确一个基本概念,即bit串本身是没有意义的,只有结合特定上行文 ( context )中才能表示具体信息,才具有实际意义。下面开始介绍正文。

        补码定义:

        将书中给出的补码定义式摘出如下(想深入了解来龙去脉的童鞋,强烈推荐阅读此书相关章节):

                                      

       该式定义了w bits的2进制位串对应的补码值的数学表示,即binary to two's-complement的数学计算式。是一个位向量,一个w位的位向量也可以表示成[x(w-1), x(w-2), ..., x(0)],其中x(i)表示第i位的bit值(0或1)。

       对于补码,其最高有效位x(w-1)也称符号位,其权重为-2^(w-1),符号位被设置为1时,表示值为负,当设置为0时,值为非负。

       根据上式,一个由w bits的位向量表示的补码可以这样计算:

       1)对于正数,即为0 - (w-2)位的加权和(因为此时最高有效位,即第w-1位,为0,故其实是剩余w-2位的加权和,可见,与原码计算方法一致)

       2)对于负数,最高有效位除表示符号位外,也参与计算,其权重为-2^(w-1),该值再与剩余w-2位的加权和求和,从而得到最终补码值

       另外需要明确的是,位向量与补码值的对应关系是双射,即给定一个位向量,其表示的补码值是唯一的,反之,给定一个补码值,可以反推出一个唯一的位向量。

实例:

     1. 给定10进制值,求其2进制补码表示 

       例如,求-15的2进制补码表示

       思路:大于15的且为2的n次幂的数列最小值为16,即2^4,考虑符号后,小于-15且绝对值为2的n次幂的数列最大值显然是 -1 * 2^4,可见,-15需要一个5 bits的位向量表示,具体计算过程为:-15 = -1 * 2^4 + 1 * 2^0,将其表示成位向量即为10001

       同理,-23 = -1 * 2^5 + 1 * 2^3 + 1 * 2^0,表示成位向量即为101001

       至此,对于给定的10进制数值,其2进制补码表示的快速计算方法,就介绍完了,掌握方法的基础上多加练习即可。

     2. 给定补码的2进制表示,反推其10进制数值

       这个过程更简单,求各位加权和,只需记得最高有效位除表示符号外,也参与计算且权重为-2^(w-1)即可

       例如:已知11001011为某数的补码2进制表示,则该值的10进制值为:-1 * 2^7 + 1 * 2^6 + 1 * 2^3 + 1 * 2^1 + 1 * 2^0 = -53

       上面的例子旨在说明计算方法,当遇到很大的数值需要计算时,如调试程序时看到0xfffffffa之类的值,上面的介绍的计算方法未免有点力不从心,还有其它的快速计算技巧,本文提到的书中有所说明,此处不再赘述。


    (全帖完)


你可能感兴趣的:(计算机,补码,计算方法)