- 论坛徽章:
- 0
|
不用判断语句,求两个数的最大值
[quote]原帖由 "FH"]不对。没考虑溢出。[/quote 发表:
FH 所言甚差.....
我认为,我写的函数:
int max(int a, int b) {
int tmp[2];
tmp[(a-b)>;>;31] = a;
tmp[(b-a)>;>;31] = b;
return tmp[0];
}
能够非常高效,准确地完成任务,并没有什么所谓的溢出问题。
1、大家都知道:
singed int 取值范围是 -0x7fffffff ---- +0x7fffffff
unsinged int 取值范围是: 0 --- 0xfffffff
这是32位机器 int 类型所能提供的最大取值范围(当然你可以用long long 而达到64位)。
我们作个实验:
main()
{
printf("a=%d,b=%d\t", 0x7fffffff, 0x7ffffff0);
printf("the max is %d\n", max(0x7fffffff, 0x7ffffff0));
}
看看结果:
a=2147483647, b=2147483632 the max is 2147483647
结果完全正确,并没什么溢出问题。
2、按 FH 的逻辑,看看下面代码是否有问题?
int sum(int a, int b) {
return a + b;
}
错误!!!!没有考虑溢出问题!!!!!
那么所有涉及运算的代码都必须考虑溢出问题!!!!
3、结论是:当我们作运算时,只要在 数据类型的取值范围内作正确的运算,就没必要过多考虑溢出问题。。。。 |
|