我正在阅读有关在 C 中检测溢出的技术。此外,显示检测溢出的错误解决方案的示例之一是:
/* Determine whether arguments can be added without overflow */
int tadd_ok(int x, int y) {
int sum = x+y;
return (sum-x == y) && (sum-y == x);
}
它说它不起作用,因为:
二进制补码加法形成一个阿贝尔群,因此无论加法是否溢出,表达式 (x+y)-x 都将计算为 y,并且 (x+y)-y 将始终计算为 x
它到底是什么意思?这是否意味着C编译器替换sum
为x+y
?
为了弄清楚它在说什么,我什至跟踪了程序的汇编代码,但没有替换的迹象。
更新:我的问题的本质是,GCC 是否评估表达式而不计算它?
这不是关于二进制补码的问题。您可以在此处
查看示例输出。