首页 > 解决方案 > 交换两个整数而不产生第三次溢出

问题描述

我正在尝试在 C 中不使用 tmp 的情况下编写交换函数,这就是我正在使用的:

void swap(int *a, int* b) {
    *a += *b;
    *b = *a - *b;
    *a -= *b;
}

现在的一个问题(或者我认为)是如果*a + * b > INT_MAX. 令人困惑的是,即使在边缘情况下它实际上也能正常工作。有人可以解释为什么吗?

以下是我使用的一些测试用例:

int main() {
    int t1Swap[] = {INT_MAX, 1};
    int t2Swap[] = {INT_MAX, INT_MIN};
    int t3Swap[] = {INT_MAX, INT_MAX-1000};
    int t4Swap[] = {INT_MIN, INT_MIN+1000};
}

提前致谢!

标签: cswap

解决方案


有符号整数溢出是未定义的行为,因此它可能会或可能不会根据您的特定系统和编译器工作。为避免这种未定义的行为,请使用按位 XOR 运算符而不是加法和减法来交换变量,而不引入 a temp

a=a^b;
b=a^b;
a=a^b;

推荐阅读