1.练习题 2.31

练习题 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 是一定的
所以,这不可作为判断溢出的条件

posted @ 2022-11-11 23:42  satellite2002  阅读(46)  评论(0编辑  收藏  举报