关于补码以及基本的补码运算

0.最基本的,补码怎么得到,这里不讨论。以及原码和补码的和是0,这个基础的结论,这里不做说明。

 

1.加法的时候,判断溢出的方法:当两个加数的符号位相同,且结果的符号位与加数符号位不同的时候,则产生了溢出。显然,两个数,如果异号,显然不会溢出。溢出,只会出现在同号的情况,则有上面的结论。

 

2.补码也是有权码。假如总共有n个比特,除最高位(符号位)以外,每一位的权值为2^i。而最高位的权值是-2^(n-1)!注意是负的!这一点很好理解:原码和补码的和是2^n,由于总共的位数只有n位,因此和的结果是0,因此补码的最高位权值就是负的。

 

3.有符号数的乘法(补码的乘法),例子-5*-3:

        1011

        1101

-----------

      00000

      11011

-----------

     111011

     00000

-----------

    1111011

    11011

------------

   11100111

   00101

-------------

   00001111

有符号数的乘法与无符号数的乘法的区别在于:

a.在做每一位的乘法的时候,都要做一个位扩展,即扩展符号位。如上的例子,第一步做1011*1的结果是11011,扩展了一位符号位1。道理很简单,因为这一步的结果要和下一步做一个加法,而下一步的加数的位宽较现在这一步位宽要宽一位,而加法发生在位宽相同的两个数之间,因此要做一个符号位的扩展。

b.最高位的乘法与其他位稍有不同。因为最高位的权值是-2^(n-1) ,所以乘法的结果要做一个取反加一的操作。如上例,1011*1(最高位的1),结果是11011(做符号位扩展),然后做一个取反加一的操作,得到例子中的00101。

 

4.有符号数的除法:先将有符号数取绝对值,做无符号数的除法,得到结果,最后根据被除数和除数的符号,确定商以及余数的符号。

 

posted on 2010-04-20 15:06  vincenzo.lai  阅读(1240)  评论(0编辑  收藏  举报

导航