补码加法与乘法正确性的简明证明
前置:
原码: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]原=[2k + a]原 (a<0,对号入座)
对命题①:
1. a>0,b>0 → a+b>0,得证
2. a>0,b<0 → [a]补+[b]补 = 2k + (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数据范围知,求余后结果为 2k + (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,得证

浙公网安备 33010602011771号