计算流程
图源:王道计租
原理
对于任意一个数字
[
x
y
]
补
[xy]_{补}
[xy]补 !=
[
x
]
补
[x]_{补}
[x]补
[
y
]
补
[y]_{补}
[y]补
我们接下来就是要推导其究竟应该等于什么
注意到
[
x
]
补
=
x
0
.
x
1
x
2
.
.
.
.
.
.
x
n
[x]_{补} = x_0.x_1x_2 ......x_n
[x]补=x0.x1x2......xn
其代表的真值可以表示为
x
=
−
x
0
+
x
1
∗
2
−
1
+
x
2
∗
2
−
2
+
.
.
.
.
.
.
x
n
∗
2
−
n
)
=
−
x
0
+
(
x
1
−
x
1
∗
2
−
1
)
+
(
x
2
∗
2
−
1
−
x
2
∗
2
−
2
)
=
x
1
−
x
0
+
(
x
2
−
x
1
)
∗
2
−
1
+
(
x
3
−
x
2
)
∗
2
−
2
+
.
.
.
.
.
.
(
x
n
−
x
n
−
1
)
∗
2
−
n
x= -x_0+x_1 *2^{-1}+x_2 *2^{-2}+......x_n *2^{-n})= \\-x_0+(x_1-x_1 *2^{-1})+(x_2*2^{-1}-x_2 *2^{-2})= \\x_1-x_0+(x_2-x_1) *2^{-1}+(x_3-x_2)*2^{-2}+......(x_n-x_{n-1}) *2^{-n}
x=−x0+x1∗2−1+x2∗2−2+......xn∗2−n)=−x0+(x1−x1∗2−1)+(x2∗2−1−x2∗2−2)=x1−x0+(x2−x1)∗2−1+(x3−x2)∗2−2+......(xn−xn−1)∗2−n
我们知道,补码的符号位是可以直接参与运算的。
两个补码的加减是可以直接连带着符号进行的。
但是如果我们要计算xy的补码,是不可以直接等价于x的补码和y的补码相乘的
这是因为这么解释后,没法再按照补码的规则解释回去。
因此才有了如下的变形。
计算
[
x
∗
y
]
补
[x*y]_{补}
[x∗y]补的等价形式
x
∗
y
=
x
∗
(
−
y
0
+
y
1
∗
2
−
1
+
y
2
∗
2
−
2
+
.
.
.
.
.
.
y
n
∗
2
−
n
)
=
x
∗
(
−
y
0
+
(
y
1
−
y
1
∗
2
−
1
)
+
(
y
2
∗
2
−
1
−
y
2
∗
2
−
2
)
+
.
.
.
.
.
.
(
y
n
∗
2
−
n
+
1
−
y
n
∗
2
−
n
)
)
=
x
∗
(
y
1
−
y
0
+
(
y
2
−
y
1
)
∗
2
−
1
+
(
y
3
−
y
2
)
∗
2
−
2
+
.
.
.
.
.
.
(
y
n
−
y
n
−
1
)
∗
2
−
n
)
x*y=x*(-y_0+y_1 *2^{-1}+y_2 *2^{-2}+......y_n *2^{-n})\\=x*(-y_0+(y_1-y_1 *2^{-1})+(y_2*2^{-1}-y_2 *2^{-2})\\+......(y_n*2^{-n+1}-y_n *2^{-n}))\\=x*(y_1-y_0+(y_2-y_1) *2^{-1}+(y_3-y_2)*2^{-2}\\+......(y_n-y_{n-1}) *2^{-n})
x∗y=x∗(−y0+y1∗2−1+y2∗2−2+......yn∗2−n)=x∗(−y0+(y1−y1∗2−1)+(y2∗2−1−y2∗2−2)+......(yn∗2−n+1−yn∗2−n))=x∗(y1−y0+(y2−y1)∗2−1+(y3−y2)∗2−2+......(yn−yn−1)∗2−n)
因此逆向按照
[
x
]
补
[x]_{补}
[x]补的解释方式
[
x
∗
y
]
补
=
[
x
]
补
∗
[
y
1
−
y
0
,
.
.
.
,
y
n
−
y
n
−
1
]
[x*y]_{补}=[x]_{补}*[y_1-y_0,...,y_n-y_{n-1}]
[x∗y]补=[x]补∗[y1−y0,...,yn−yn−1]
即为x与
[
y
1
−
y
0
,
.
.
.
,
y
n
−
y
n
−
1
]
[y_1-y_0,...,y_n-y_{n-1}]
[y1−y0,...,yn−yn−1]依次按照乘法相乘即可
我们依次按照第二项的某一位的正负,按照类似原码相乘的方法进行计算即可。具体参考上边的计算方法。