补码加法与乘法正确性的简明证明

前置:

  原码:k位二进制数中,后k-1位用于记录数值大小,若为正数,第k位为0,反之为1。

  补码:正数的补码与原码相同,负数的补码由将该数后k-1位按位取反后加1得到。

  4位二进制中,0有0000(+0)或1000(-0)之分,但补码均为0000。以下略去与0相关的部分。

正文:

  在计算机中,数据以补码的形式参与运算,符号位无特判,运算遵循二进制正整数运算法则。但由于位数的有限性,计算机无法表示 大于k 位上的“1”,那么实际运算过程中相当于任意时刻对2k取正余数(mod 2k)。

  需要证明的命题分别是:

  ①[a]+[b] =[a+b]

   ②[a]×[b] =[a×b]补 

    *这里的a与b都是数本身,不是原码或补码。可用带符号十进制来理解。 a,b不为0,且在k位表示中合法。结果也需合法。

  对取补码的过程,有

  [a]补 = [a] (a≥0)    [a]补 =[2k-1 + (2k-1 -1)+a+1]=[2+ a] (a<0,对号入座)

  

  对命题①:

  1. a>0,b>0 → a+b>0,得证

  2. a>0,b<0 → [a]+[b]补 = 2+ (a+b)   若(a+b)<0 得证;若 (a+b)>0 ,mod 2k后得a+b,得证。

  3. a<0,b<0 →  [a]+[b]补 = 2k+1 + (a+b)  由a、b数据范围知,求余后结果为 2+ (a+b) ,得证。

  

  对命题②:

  1. a>0,b>0 → a×b>0,得证

  2. a>0,b<0 → [a]补 ×[b]补 =a·(2k+b)=a×b + a×2k  求余后得 a×b + 2k,得证

  3. a<0,b<0 →  [a]补 ×[b]补 =(2k+a)·(2k+b)= a×b+(a+b+2k)×2k+1,求余后结果为a×b,得证

 

  

  

  

posted @ 2020-10-02 13:05  难以理解  阅读(1015)  评论(0)    收藏  举报