c - 交换两个整数而不产生第三次溢出
问题描述
我正在尝试在 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};
}
提前致谢!
解决方案
有符号整数溢出是未定义的行为,因此它可能会或可能不会根据您的特定系统和编译器工作。为避免这种未定义的行为,请使用按位 XOR 运算符而不是加法和减法来交换变量,而不引入 a temp
:
a=a^b;
b=a^b;
a=a^b;
推荐阅读
- php - php7.4 mysqli 因“消失”而超时
- c# - 当字符串设置为标签的文本并显示在面板中时,为什么 string.Format 不起作用?
- python - pandas read_excel 即使在 index_col=none 时也会创建索引
- python - 在 python pandas 数据框中展开行
- mysql - 与 INNER JOIN 斗争
- r - 带有对数轴的 R xyplot 以十进制格式显示数字
- c# - 有没有办法覆盖控制器上的 AuthenticationOption.DefaultChallengeScheme?
- html - 我们是否应该将字段集标记设置为隐藏以解决可访问性问题?
- mysql - 将两个查询合二为一以挑选相关列
- google-apps-script - 如何将 google apps 脚本合二为一以最小化 GMAIL API 调用