化减为加:十进制的「补码」

Posted 假如你是李华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了化减为加:十进制的「补码」相关的知识,希望对你有一定的参考价值。

补码把减法变加法的原理其实就是同余。

设 \(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 \right \}) \)

则补码 \( 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 \right \}) \)

令 \( N‘ = (9-x_0)+10(9-x_1)+10^{2}(9-x_2)+\cdots+10^{n}(9-x_n) + 1 \)

则 \( N‘ = 9+9\cdot 10 + 9\cdot 10^2 + \cdots + 9\cdot 10^n - (x_0+10x_1+10^{2}x_2+\cdots+10^{n}x_n) + 1 \)

\( = 9\cdot (1+10+10^2+\cdots+10^n) - N + 1 \)

\( = 9\cdot\frac{1-10^{n+1}}{1-10} - N + 1 \)

\( = 9\cdot \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 即答案。

 

以上是关于化减为加:十进制的「补码」的主要内容,如果未能解决你的问题,请参考以下文章

如何理解二进制原码,反码,补码,二进制补码运算

二进制的原码、补码、反码详解

二进制补码

2个二进制补码二进制数之和

一个数的原码,反码,补码怎么算

C语言进制转换时自动扩展位?(原码反码补码)(打印%o%x时会自动扩展到32位负数先得到其十进制真实数值,再根据其真实数值得到八进制十进制补码)