在CSAPP本书中,有一些代码(C语言)用于检查求和是否溢出。但是代码有错误,它询问为什么代码不起作用。
int tadd_ok(int x, int y) {
int sum = x+y;
return (sum-x == y) && (sum-y == x);
}
解决方案如下。
通过研究第2.3.2节,您的同事可以了解到 两个的补码加法组成一个阿贝尔群,因此表达式
(x+y)-x
的评估结果为y
,无论 加法运算会溢出,并且(x+y)-y
的总取值为x
。
但是在阅读完本章和第2.3.2节之后,我仍然不知道为什么该代码有错误。编译器会在对表达式sum-x == y
进行转换之前将其转换为(x+y)-x == y
吗?