练习题 2.31
补码溢出的判断
int tadd_ok(int a;int b)
{
int neg_over = a>0 && b>0 && a+b<0;
int pos_over = a<0 && b<0 && a+b>0;
return !neg_over &&pos_over;
}
你的同事对你补码加法溢出条件的分析有些不耐烦了,他给出了一个 函数 tadd_ok 的实现,如下所示:
/* Determine whether arguments can be added without overflow */
/* WARNING: This code is buggy. */
int tadd_ok(int x, int y)
{
int sum= x+y;
return (sum-x == y) && (sum-y == x);
}
这段代码是错误的:
当相加不溢出时, (sum-x == y) 和 (sum-y == x) 都是成立的
当正溢出时
sum = x + y -2^w
sum-x = x +y -2^w -x = (y - 2^w) mod 2^w = y
当负溢出时
sum = x + y + 2^w
sum -x = x + y + 2^w -x = (y + 2^w) mod 2^w = y
所以,无论正溢出还是负溢出,sum -x = y 是一定的
所以,这不可作为判断溢出的条件