补码乘法的溢出判断
两个w位补码x和y, x × y = [ x × y ] x\times y = [x\times y] x×y=[x×y],一般结果用 2 w 2w 2w位补码保存结果,然后进行截断保留低 w w w位
判断补码溢出的方式是:假设 2 w 2w 2w位结果为s = s 2 w − 1 s 2 w . . . s 1 s 0 s_{2w-1}s_{2w}...s_1s_0 s2w−1s2w...s1s0,则高w+1位 s 2 w − 1 s 2 w . . . s w − 1 s_{2w-1}s_{2w}...s_{w-1} s2w−1s2w...sw−1必须全0或全1才不会溢出,否则会溢出
表层理解:类比补码的符号扩展,当 w w w位的补码需要扩展为 2 w 2w 2w位,当补码最高位(符号位)为1则扩展的高 w w w位全1,否则全0。反过来看,对补码进行截断,若截断的高位全1或全0不影响精度,反之会影响精度。与补码溢出的判断方式吻合
数学证明
- 将
2
w
2w
2w位结果看作: 高w位用补码表示成
v
v
v,低w位用无符号整形表示成
u
u
u,则
s
s
s可写作
s = 2 w v + u s = 2^wv + u s=2wv+u - 将u看作由n位补码p转换来的: u = p + p w − 1 2 w u = p + p_{w-1}2^w u=p+pw−12w
- 结合1、2式,有: s = 2 w v + p + p w − 1 2 w = p + ( v + p w − 1 ) 2 w s = 2^wv + p + p_{w-1}2^w = p + (v+p_{w-1})2^w s=2wv+p+pw−12w=p+(v+pw−1)2w
- 此时,当 ( v + p w − 1 ) = 1 (v+p_{w-1}) = 1 (v+pw−1)=1时,s会发送溢出,v表示s的高w位, p w − 1 p_{w-1} pw−1是s的第w位。当v全0, p w − 1 p_{w-1} pw−1全0时 或 v全1, p w − 1 p_{w-1} pw−1全1时,显然有 ( v + p w − 1 ) = 0 (v+p_{w-1}) = 0 (v+pw−1)=0,此时不会溢出,与上述的判断补码溢出方法一致
参考:《深入理解计算机系统》