免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: HappyWin
打印 上一主题 下一主题

不用判断语句,求两个数的最大值  关闭 [复制链接]

论坛徽章:
0
171 [报告]
发表于 2005-07-21 11:56 |只看该作者

不用判断语句,求两个数的最大值

根据: 大数 -  小数 必定等于 正数 , 小数 - 大数 必定等于 负数
而负数,在机器里用补码表示,第 31位是1

int max(int a , int b) {
     int tmp[2];

     tmp[(a-b)>;>;31] = a;
     tmp[(b-a)>;>;31] = b;

     return tmp[0];
}

我没有实验过,各位验证一下,看对不对....

论坛徽章:
0
172 [报告]
发表于 2005-07-21 13:40 |只看该作者

不用判断语句,求两个数的最大值

不对。没考虑溢出。

论坛徽章:
0
173 [报告]
发表于 2005-07-21 21:32 |只看该作者

不用判断语句,求两个数的最大值

[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、结论是:当我们作运算时,只要在 数据类型的取值范围内作正确的运算,就没必要过多考虑溢出问题。。。。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
174 [报告]
发表于 2005-07-21 21:37 |只看该作者

不用判断语句,求两个数的最大值

1、大家都知道:
   singed int 取值范围是 -0x7fffffff ---- +0x7fffffff


这就是个错误.
  1. #include <stdio.h>;

  2. int main()
  3. {
  4.     printf("%d\n",-0x7fffffff);
  5.     printf("%d\n",0x80000000);
  6.     return 0;
  7. }
复制代码

  1. [root@Reinnat tmp]# ./055
  2. -2147483647
  3. -2147483648
复制代码


你竟然认为-2147483647 是最小的.~~ 兄弟 治学要严谨

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
175 [报告]
发表于 2005-07-21 21:44 |只看该作者

不用判断语句,求两个数的最大值

溢出不溢出自己看吧.
  1. #include <stdio.h>;

  2. int max(int a, int b) {
  3.     int tmp[2];

  4.     tmp[(a-b)>;>;31] = a;
  5.     tmp[(b-a)>;>;31] = b;

  6.     return tmp[0];
  7. }

  8. int main()
  9. {
  10.     printf("0x80000000:%d\n",0x80000000);
  11.     printf("0x7fffffff:%d\n",0x7fffffff);
  12.     printf("%d\n",max(0x80000000,0x7fffffff));
  13.     return 0;
  14. }
复制代码

  1. [root@Reinnat tmp]# ./056
  2. 0x80000000:-2147483648
  3. 0x7fffffff:2147483647
  4. -2147483648
复制代码



负数大于正数了.~ 哎.~~
能够非常高效,准确地完成任务,并没有什么所谓的溢出问题。

论坛徽章:
0
176 [报告]
发表于 2005-07-21 21:47 |只看该作者

不用判断语句,求两个数的最大值

可不可以用strcmp()函数?
虽然它是用来比较两个字符串的,但是,char和int是可以互用的
先定义一个字符串,再用getchar()输入,是不是就可以?
或者使用强制类型转换!
这写只是我的一点想法,没有试,不知道行不行!

论坛徽章:
0
177 [报告]
发表于 2005-07-21 21:52 |只看该作者

不用判断语句,求两个数的最大值

原帖由 "mq110" 发表:

你竟然认为-2147483647 是最小的.~~ 兄弟 治学要严谨



嗯~~~ 你说得对,我没有考虑到。。。

事实胜如雄辩

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
178 [报告]
发表于 2005-07-21 21:53 |只看该作者

不用判断语句,求两个数的最大值

mik
不过你的代码确实不错 如果考虑到了这个溢出的话 将是不错的.~
看出来你有深厚的汇编功底.

论坛徽章:
0
179 [报告]
发表于 2005-07-22 11:26 |只看该作者

不用判断语句,求两个数的最大值

原帖由 "mik" 发表:

FH 所言甚差.....

嘿嘿,呵呵,哈哈,活活,哼哼……

论坛徽章:
0
180 [报告]
发表于 2005-07-22 13:20 |只看该作者

不用判断语句,求两个数的最大值

这让我想到了孔乙己
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP