补码把减法变加法的原理其实就是同余。
设 (n+1) 位二进制数 ( N = overline{x_n cdots x_2x_1x_0} )
即
( N = x_0+2x_1+2^{2}x_2+cdots+2^{n}x_n ;;;; (x_i in left{ 0,1 ight }) )
则补码 ( N' = (1-x_0)+2(1-x_1)+2^{2}(1-x_2)+cdots+2^{n}(1-x_n) + 1 )
( = 1+2+2^2+cdots+2^n - (x_0+2x_1+2^{2}x_2+cdots+2^{n}x_n) + 1 )
( = 1+2+2^2+cdots+2^n - N + 1 )
( = frac{1-2^{n+1}}{1-2}-N + 1 )
( = 2^{n+1}-1-N + 1 = 2^{n+1}-N equiv -N ;; (mathrm{mod};;2^{n+1}) )
即,对于 (n+1) 位二进制数 (N), 有:
( N' equiv -N ;; (mathrm{mod};;2^{n+1}) )
所以在模 ( 2^{n+1} ) 的情况下,加上补码 ( overline{(1-x_n)cdots(1-x_2)(1-x_1)(1-x_0)}+1 ) 的效果和做减法是一样的。
那么对于十进制,就可以照葫芦画瓢:
设 (n+1) 位十进制数 ( N = overline{x_n cdots x_2x_1x_0} )
即
( N = x_0+10x_1+10^{2}x_2+cdots+10^{n}x_n ;;;; (x_i in left{ 0,1,2,cdots,9 ight }) )
令 ( N' = (9-x_0)+10(9-x_1)+10^{2}(9-x_2)+cdots+10^{n}(9-x_n) + 1 )
则 ( N' = 9+9cdot 10 + 9cdot 10^2 + cdots + 9cdot 10^n - (x_0+10x_1+10^{2}x_2+cdots+10^{n}x_n) + 1 )
( = 9cdot (1+10+10^2+cdots+10^n) - N + 1 )
( = 9cdotfrac{1-10^{n+1}}{1-10} - N + 1 )
( = 9cdot frac{10^{n+1}-1}{9} -N + 1 )
( = 10^{n+1}-1-N + 1 = 10^{n+1}-N equiv -N ;; (mathrm{mod};;10^{n+1}) )
也就是说,对于十进制也有类似结论:
( N' = overline{(9-x_n)cdots(9-x_2)(9-x_1)(9-x_0)}+1 equiv -N ;; (mathrm{mod};;10^{n+1}) )
举个例子,要计算 9912-6543, 先求出 6543 的「补码」( overline{(9-6)(9-5)(9-4)(9-3)}+1 ) 即 3457, 然后计算 9912+3457 = 13369, 再模 10000 ( 即舍去进到万位的 1 ), 得到 3369 即答案。