化减为加:十进制的「补码」
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 即答案。
以上是关于化减为加:十进制的「补码」的主要内容,如果未能解决你的问题,请参考以下文章
C语言进制转换时自动扩展位?(原码反码补码)(打印%o%x时会自动扩展到32位负数先得到其十进制真实数值,再根据其真实数值得到八进制十进制补码)