不使用比较运算符,求两个数中的最大值

思路:两数相减,根据符合位的正负判断谁大谁小。
需要注意的是,两数相减可能会溢出,如果溢出,再根据符合位判断,显然会错误,所以,溢出的情况要单独处理。
如果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));
}
posted @ 2022-04-19 18:17  enbug  阅读(94)  评论(0编辑  收藏  举报