#include<iostream>
using namespace std;
void swap1(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void swap2(int &a,int &b)
{
a=a+b;
b=a-b;
a=a-b;
}
void swap3(int &a,int &b)
{
a=a^b;//*
b=a^b;//**
a=a^b;//***
}
int main()
{
int n1=1,n2=3;
swap1(n1,n2);
printf("n1=%d,n2=%d/n",n1,n2);
int n3=5,n4=8;
swap3(n3,n4);
printf("n3=%d,n4=%d/n",n3,n4);
int a=2147483647;
int b=1;
swap2(a,b);
printf("a=%d,b=%d/n",a,b);
return 0;
}
注意:在这里swap2交换溢出之所以正确,具体如下
swap2是容易产生溢出的。在swap2交换中a的补码为01111111 11111111 11111111,(*)式a+1的
补码为10000000 00000000 00000000为-2147483648,-1的补码11111111 11111111 11111111
(**)式b=a-b=10000000 00000000 00000000+11111111 11111111 11111111=01111111 11111111 11111111
=2147483647,-b的补码:10000000 00000000 00000001
(***)a=a-b=10000000 00000000 00000000+10000000 00000000 00000001=00000000 00000000 00000001=1