不使用比较运算符,求两个数中的最大值
思路:两数相减,根据符合位的正负判断谁大谁小。
需要注意的是,两数相减可能会溢出,如果溢出,再根据符合位判断,显然会错误,所以,溢出的情况要单独处理。
如果x-y产生了溢出,那么x和y必定一个是负数,一个是非负数。这样,非负数就是最大值,根据符合位是否为0就可以判断。
#include <stdio.h>
int tadd_ok(int a, int b)
{
return !(a>0&&b>0&&a+b<=0 || a<0&b<0&&a+b>=0);
}
#include <limits.h>
int tsub_ok(int a, int b)
{
if(b==INT_MIN)
{
if(a<0)
return 1;
else
return 0;
}
return tadd_ok(a,-b);
}
int max(int a, int b)
{
if(tsub_ok(a,b))//如果a-b不溢出,直接根据a-b的正负判断结果。
return ( (unsigned)(a-b) ) >>(sizeof(a)*8-1)?b:a;
//如果溢出,a b必定一非负一负,非负者为最大值
return ( ((unsigned)a)>>(sizeof(a)*8-1) ) ?b:a;
}
int main()
{
printf("%d\n", max(INT_MAX, -8));
}