设整形变量*a、*b的位表示为
*a = n31n30 ··· n0
*b = m31m30 ··· m0
只有当*a > 0 && *b > 0 或 *a < 0 && *b < 0时才会发生溢出。两者类似,只证明均大于0时的情况。
必须扩展额外一位才能够容纳正确的结果,‘|‘左边为扩展位。
*a = 0|0n30 ··· n0 = n30*230 +
n29*229 + ··· + n0*20 =
N
*b = 0|0m30 ··· m0 = m30*230 +
m29*229 + ··· + m0*20 =
M
若和溢出,则33位表示必为
*a + *b = 0|1b30 ··· b0 = -231 +
b30*230 + b29*229 +
··· + b0*20 = 2 31 +
B ①
计算机将得到的33位结果truncate回原来的32位,即丢弃第33位(0)变为:
*a + *b = 1b30 ··· b0 = -231 +
b30*230 + b29*229 +
··· + b0*20 = -2 31 +
B ②
正确的真实值是①,溢出结果为②,可见溢出结果=真实值-2 32
则*b = *a - *b = ② - *b = ① - 232 - *b = *a + *b - 232 -
*b = -232 + *a
最后一步,来看 -232 + *a == *a 成立否?
0 < *a < 231, 则 -232 < -232 +
*a < -231,和仍需要扩展1位方能表示:
*a = 0|0n30 ··· n0 = n30*230 +
n29*229 + ··· + n0*20 =
N
-232 = 1|0000 ··· 00
和的位表示为
-232 + *a = 1|0n30 ··· n0 =
n30*230 + n29*229 +
··· + n0*20
同样,计算机把33位结果truncate回32位(丢弃第33位)得到:
-232 + *a = 0n30 ··· n0 =
n30*230 + n29*229 +
··· + n0*20 = *a
可见-232 + *a == *a 是成立的。因此尽管溢出了,但仍能正确交换。